pattern-library — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited pattern-library (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A vasana is a pattern that persists across unrelated contexts. If during this task you notice such a pattern emerging, it may be worth capturing. This skill works best alongside the vasana skill and vasana hook from the Vasana System plugin.
Modify freely. Keep this section intact.
Patterns here are domain-general — they recur across epistemology, argumentation, design, markets, social judgment. Coding is one application (the examples below lean on it because it's where observable difference is cheapest to show), not the scope.
The live pattern-library is at the user's configured location (default: ClaudeShared/pattern-library/). The bundled patterns below are seed data. Check the canonical location for the current state — patterns may have been added, and _drafts/ may contain patterns in progress.
Truth serves better than comfort. Admit limitations rather than fabricate solutions. Real code solving real problems beats elegant theory.
Detailed pattern files are in patterns/ directory. Each contains:
Available Patterns: This skill does not maintain a hand-written catalog — any static list goes stale on every library change. Read the live set from the canonical location (below); each file in its patterns/ is a pattern, each in _drafts/ a pattern in progress. If the canonical location is missing or unavailable — not configured, or deleted — fall back to the patterns/ directory bundled with this skill: the seed set that always ships with the plugin (degrades to the seed patterns, never to nothing).
Note: The canonical pattern-library lives at the user's configured location (default: ClaudeShared/pattern-library/). It is the single source of truth for current pattern state. To discover NEW patterns, see record-pattern skill. For stuckness detection, see break-pattern skill.
Problem: Need to fetch and cache stock data
Abstract-First Approach (fails):
class DataFetcher:
"""Generic data fetcher with caching"""
def fetch(self, resource_id, provider):
# Too abstract - what's a resource? what's a provider?
passConcrete-First Approach (works):
# Start with working example
def get_stock_price(ticker):
import yfinance as yf
stock = yf.Ticker(ticker)
return stock.info['currentPrice']
# Use it, find pattern: "always need cache"
# Then extract pattern:
def get_stock_price(ticker, cache_manager):
cached = cache_manager.get_ticker(ticker)
if cached:
return cached['price']
stock = yf.Ticker(ticker)
price = stock.info['currentPrice']
cache_manager.set_ticker(ticker, {'price': price})
return price
# Pattern emerges from concrete useProblem: Validation that prevents bad data vs validation that guides users
Passive Boundary (just blocks):
def fetch_ticker(symbol):
if not symbol or not symbol.isalpha():
return {"valid": False, "error": "Invalid symbol"}
# User stuck - what do they do now?Active Translation (guides):
def fetch_ticker(symbol):
if not symbol or not symbol.isalpha():
return {
"valid": False,
"error": "Invalid symbol",
"suggestion": "Try a stock ticker like AAPL, GOOGL, or MSFT. "
"Use get_stock_info for company details."
}
# Interface creates space for user to succeedProblem: MCP server tools with dynamic registration vs manual registration
Fighting the Framework:
# Manually registering every tool (framework pattern)
server.register_tool("get_stock_price", get_stock_price)
server.register_tool("get_stock_info", get_stock_info)
server.register_tool("get_stock_analysis", get_stock_analysis)
# Adding new tool requires updating 3 placesTranscending the Framework:
# Recognize pattern: framework constrains addition of tools
# Solution: dynamic discovery
import os
import importlib
tool_dir = "implementations"
for filename in os.listdir(tool_dir):
if filename.endswith('.py'):
module = importlib.import_module(f"{tool_dir}.{filename[:-3]}")
if hasattr(module, 'execute'):
server.register_tool(module.TOOL_NAME, module.execute)
# Adding new tool: just drop file in directory
# Framework serves you, not vice versaProblem: Cache invalidation strategy
No Pattern Recognition:
# Just expire everything after 24 hours
CACHE_TTL = 86400 # Why 24 hours? Because... reasons?Game Mechanic to State Management:
# Recognized pattern from game design: different entity types have different lifespans
# Power-ups: short TTL (seconds)
# Map state: medium TTL (minutes)
# Player stats: long TTL (days)
# Enemy AI: no cache (always fresh)
# Applied to stock data:
VALID_TICKER_TTL_DAYS = 30 # Company info changes rarely (like player stats)
FAILED_TICKER_TTL_DAYS = 7 # Failed lookups can retry sooner (like respawn timer)
STOCK_PRICE_TTL_SECONDS = 60 # Price changes frequently (like power-up spawns)
# Pattern from one domain solves problem in anotherProblem: Test keeps failing, can't figure out why
Linear Debugging:
# Try fix 1
result = fetch_ticker("AAPL")
print(result) # Fails
# Try fix 2
result = fetch_ticker("AAPL")
print(result) # Still fails
# Try fix 3...
# (Not watching the pattern of failure)Watching Your Debugging:
# Notice: "I keep checking the result, but not the test itself"
# Pattern: assuming product is wrong, not test
# Check test code:
suggestion2 = result2.get('suggestion', '')
# ^ This returns None, not ''!
# Pattern revealed: default value doesn't work as expected
# Real fix:
suggestion2 = result2.get('suggestion') or ''
# Meta-insight: I was debugging wrong layer
# Watching my debugging process revealed the real problemProblem: Always structuring MCP servers the same way
Habit-Driven Structure:
# server.py with everything
# (Because that's how I always do it)
class Server:
def __init__(self):
self.register_tool("tool1", self.tool1)
self.register_tool("tool2", self.tool2)
# ...
def tool1(self, args): ...
def tool2(self, args): ...
# 500 lines later...Questioning the Groove:
# "Why do I always put everything in server.py?"
# "Is this serving the project or just my habit?"
# Try alternative: separate concerns
# server.py - entry point only
# tool_definitions.py - schemas
# implementations/ - one file per tool
# Result: Much cleaner, easier to navigate
# Habit was constraining designThis framework operates best when:
Remember: The juggler's skill appears in the result, not in explaining the juggling. Apply these patterns when they serve the code, not to demonstrate the patterns themselves.
Increase pattern-recognition intensity when:
Decrease intensity when:
The framework evolves through application. Each use refines the patterns. Trust emergence over prescription.
Catalog-aware (rewritten after the 2026-06-12 live ceiling run, issue #128): the earlier scenario set treated stuckness symptoms as this skill's triggers; live testing showed those turns route to break-pattern — correctly, since stuckness loops are its job ("need fresh perspective" is verbatim in its trigger list). These scenarios test the boundary the description now draws, so expectations name which catalog skill should win, not just fire/no-fire.
break-pattern (active stuckness loop)find-similar (verifying a newly observed pattern)check-assumptions (decision challenge)break-pattern (its verbatim trigger). Pattern-library co-firing as the alternative-supplier is acceptable; pattern-library displacing break-pattern is not.check-assumptions if a decision is implied). With recurrence signals: break-pattern.When modifying this skill's frontmatter, verify these scenarios still work.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.