ALWAYS load before starting any task. Provides persistent cross-session memory for learning from past work. Read memory at task start to avoid repeating mistakes; write memory at task end to record what worked. Covers decisions.json (architectural choices), patterns.json (proven approaches), failures.json (past errors and fixes), preferences.json (project conventions), and session activity logs.
Maintains persistent memory across sessions by reading past decisions and patterns before tasks and logging outcomes after completion.
/plugin marketplace add mgd34msu/goodvibes-plugin/plugin install goodvibes@goodvibes-marketThis skill inherits all available tools. When active, it can use any tool Claude has access to.
references/schemas.mdscripts/validate-memory-usage.shscripts/
validate-memory-usage.sh
references/
schemas.md
The memory system enables cross-session learning by capturing decisions, patterns, failures, and preferences in structured JSON files. Every agent must read memory before starting work and write to it after completing work.
Without memory:
With memory:
.goodvibes/
|-- memory/ # Structured JSON (machine-readable)
| |-- decisions.json # Architectural decisions
| |-- patterns.json # Proven approaches
| |-- failures.json # Past errors + resolutions
| |-- preferences.json # Project conventions
| +-- index.json # Index file (optional)
+-- logs/ # Markdown logs (human-readable)
|-- activity.md # Completed work log
|-- decisions.md # Decision log with context
+-- errors.md # Error log with resolution
Always check memory files before implementing ANY task. Use keyword-based searches to find relevant entries.
failures.jsonPurpose: Avoid repeating known failures.
How:
# Use precision_read to read the file
precision_read:
files:
- path: .goodvibes/memory/failures.json
verbosity: standard
# Search for keywords matching your task
# Example keywords: "precision_fetch", "config", "auth", "API", "build"
What to look for:
keywords field matches your task (e.g., searching for "auth" finds authentication failures)error field describes a similar problemcontext field matches your current situationIf found:
resolution -- how was it fixed?prevention -- how to avoid it?patterns.jsonPurpose: Use proven approaches instead of inventing new ones.
How:
precision_read:
files:
- path: .goodvibes/memory/patterns.json
verbosity: standard
What to look for:
keywords matches your task typewhen_to_use describes your situationname suggests a relevant patternIf found:
description -- what's the pattern?example_files -- where is it used?decisions.jsonPurpose: Respect prior architectural decisions.
How:
precision_read:
files:
- path: .goodvibes/memory/decisions.json
verbosity: standard
What to look for:
scope includes files you'll modifycategory matches your domain (e.g., "architecture", "pattern", "library")status is "active" (not "superseded" or "reverted")If found:
what and why -- understand the decisionpreferences.jsonPurpose: Apply project-specific conventions.
How:
precision_read:
files:
- path: .goodvibes/memory/preferences.json
verbosity: standard
What to look for:
key matches your domain (e.g., "category.preference_name")If found:
value preferencereason rationaleManual keyword matching: Read the file and scan for keywords related to your task.
Example:
auth, clerk, authentication, login, sessionfailures.json for past auth failurespatterns.json for auth patternsdecisions.json for auth library decisionsScope filtering: Focus on entries where scope includes files you'll modify.
Log to memory after completing a task, resolving an error, or making a decision. Always write to BOTH JSON (machine-readable) and Markdown (human-readable).
| Situation | Write to |
|---|---|
| Task passes review | activity.md + optionally patterns.json/decisions.json |
| Error resolved | errors.md + failures.json |
| Decision made | decisions.md + decisions.json |
| Never write | Trivial fixes, no new patterns, no decisions |
1. Always log to activity.md
Format:
## YYYY-MM-DD: [Brief Title]
**Task**: [What was the goal?]
**Plan**: [Approach taken, or N/A]
**Status**: COMPLETE
**Completed Items**:
- [List of what was accomplished]
**Files Modified**:
- [List of changed files with brief description]
**Review Score**: [X/10]
**Commit**: [commit SHA]
---
2. Optionally add to patterns.json (if a reusable pattern emerged)
Only add if:
Schema:
{
"id": "pat_YYYYMMDD_HHMMSS",
"name": "PatternNameInPascalCase",
"description": "What the pattern does and why it works",
"when_to_use": "Situation where this pattern applies",
"example_files": ["path/to/file.ts", "another/example.ts"],
"keywords": ["searchable", "terms"]
}
3. Optionally add to decisions.json (if an architectural decision was made)
Only add if:
Schema:
{
"id": "dec_YYYYMMDD_HHMMSS",
"date": "YYYY-MM-DDTHH:MM:SSZ",
"category": "library|architecture|pattern|convention",
"what": "What was decided",
"why": "Rationale for the decision",
"scope": ["files/directories affected"],
"confidence": "high | medium | low",
"status": "active|superseded|reverted"
}
1. Always log to errors.md
Format:
## YYYY-MM-DD HH:MM - [ERROR_CATEGORY]
**Error**: [Brief description]
**Context**:
- Task: [What were you doing?]
- Agent: [Which agent encountered it?]
- File(s): [Affected files]
**Root Cause**: [Why did it happen?]
**Resolution**: [How was it fixed? Or UNRESOLVED]
**Prevention**: [How to avoid it in the future?]
**Status**: RESOLVED | UNRESOLVED
---
2. Always add to failures.json (with full context)
Schema:
{
"id": "fail_YYYYMMDD_HHMMSS",
"date": "YYYY-MM-DDTHH:MM:SSZ",
"error": "Brief error description",
"context": "What task was being performed",
"root_cause": "Technical explanation of why it failed",
"resolution": "How it was fixed (or UNRESOLVED)",
"prevention": "How to avoid this failure in the future",
"keywords": ["searchable", "error-related", "terms"]
}
Error categories (for errors.md):
TOOL_FAILURE -- Precision tool or native tool failedAGENT_FAILURE -- Agent crashed or failed to complete taskBUILD_ERROR -- TypeScript compilation, build step failedTEST_FAILURE -- Test suite failedVALIDATION_ERROR -- Validation, linting, or format checking failedEXTERNAL_ERROR -- API, network, dependency issueUNKNOWN -- Error category could not be determined1. Always log to decisions.md
Format:
## YYYY-MM-DD: [Decision Title]
**Context**: [What situation required a decision?]
**Options Considered**:
1. **[Option A]**: [Description + trade-offs]
2. **[Option B]**: [Description + trade-offs]
**Decision**: [What was chosen]
**Rationale**: [Why this option was best]
**Implications**: [What this means for future work]
---
2. Always add to decisions.json
See schema in "After Task Passes Review" section above.
Use timestamp-based IDs to avoid needing to read existing entries before writing:
dec_YYYYMMDD_HHMMSS # Decisions
pat_YYYYMMDD_HHMMSS # Patterns
fail_YYYYMMDD_HHMMSS # Failures
pref_YYYYMMDD_HHMMSS # Preferences
Example: dec_20260215_143022 for a decision made on 2026-02-15 at 14:30:22
Collision risk: Negligible unless two agents write to the same file in the same second. The timestamp provides sufficient uniqueness.
Before first write to any memory/log file, check if it exists:
If file doesn't exist, create with bare array:
[]
If file doesn't exist, create with header:
# [File Name]
Log of [description].
---
Use precision_read first:
precision_read:
files:
- path: .goodvibes/memory/decisions.json
verbosity: count_only # Just check existence
If exists: false, create the file before appending.
Use the scripts/validate-memory-usage.sh script to verify compliance:
# Validate memory protocol usage
bash plugins/goodvibes/skills/protocol/goodvibes-memory/scripts/validate-memory-usage.sh \
session-transcript.jsonl \
.goodvibes/memory/
# Exit code 0 = compliant
# Exit code 1 = violations found
The script checks:
failures.json -- keyword search for similar errorspatterns.json -- keyword search for proven approachesdecisions.json -- scope search for relevant decisionspreferences.json -- apply project conventionsactivity.md after task completionpatterns.json if reusable pattern discovereddecisions.json if architectural decision madeerrors.md + failures.json if error resolveddecisions.md + decisions.json if choice madelast_updated timestamp in JSON files# Step 1: Read failures.json
precision_read:
files:
- path: .goodvibes/memory/failures.json
verbosity: standard
# Step 2: Manually search for keywords
# Keywords: "auth", "authentication", "clerk", "oauth", "token"
# Found: fail_20260210_160000 - "Service registry reads empty services"
# Context: OAuth token configuration issue
# Prevention: "Always use nested config format for services"
# Step 3: Apply prevention strategy
# Use nested format when configuring auth service
# Step 1: Check if file exists
precision_read:
files:
- path: .goodvibes/memory/patterns.json
verbosity: count_only
# Step 2: Read existing patterns to avoid duplicates
precision_read:
files:
- path: .goodvibes/memory/patterns.json
verbosity: standard
# Step 3: Add new pattern (if not duplicate)
precision_edit:
files:
- path: .goodvibes/memory/patterns.json
operations:
- type: insert
search: '"patterns": ['
content: |
{
"id": "pat_20260215_143022",
"name": "AuthServiceNesting",
"description": "Auth services require nested config structure",
"when_to_use": "When configuring auth providers in goodvibes.json",
"example_files": [".goodvibes/goodvibes.json"],
"keywords": ["auth", "config", "nested", "services"]
},
# Step 1: Log to errors.md
precision_edit:
files:
- path: .goodvibes/logs/errors.md
operations:
- type: insert_at_line
line: 1
content: |
## 2026-02-15 14:30 - BUILD_ERROR
**Error**: TypeScript compilation failed with "Cannot find module 'clerk'"
**Context**:
- Task: Add Clerk authentication
- Agent: Engineer
- File(s): src/auth/clerk.ts
**Root Cause**: Missing @clerk/nextjs package in dependencies
**Resolution**: RESOLVED - Added package with `npm install @clerk/nextjs`
**Prevention**: Always check package.json before importing new libraries
**Status**: RESOLVED
---
# Step 2: Add to failures.json
precision_edit:
files:
- path: .goodvibes/memory/failures.json
operations:
- type: insert
search: '['
content: |
{
"id": "fail_20260215_143022",
"date": "2026-02-15T14:30:22Z",
"error": "TypeScript compilation failed - Cannot find module 'clerk'",
"context": "Adding Clerk authentication to Next.js app",
"root_cause": "Missing @clerk/nextjs package in package.json dependencies",
"resolution": "RESOLVED - Installed package with npm install @clerk/nextjs",
"prevention": "Before importing from a new package, verify it exists in package.json. Use precision_read to check package.json before adding imports.",
"keywords": ["typescript", "clerk", "module", "dependency", "package.json", "build-error"]
},
All memory files are relative to project root:
.goodvibes/
|-- memory/
| |-- decisions.json
| |-- patterns.json
| |-- failures.json
| +-- preferences.json
+-- logs/
|-- activity.md
|-- decisions.md
+-- errors.md
Always use .goodvibes/memory/ and .goodvibes/logs/ as paths (relative to project root).
Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use for discovering, retrieving, and improving prompts.
Search, retrieve, and install Agent Skills from the prompts.chat registry using MCP tools. Use when the user asks to find skills, browse skill catalogs, install a skill for Claude, or extend Claude's capabilities with reusable AI agent components.
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.