From vasana-system
What patterns keep showing up across unrelated contexts? - Browse and apply universal behavioral patterns (vasanas) that persist across domains. Patterns are neutral observations about how behavior self-organizes - groove-deepening is also mastery, framework-dissolution can be premature. Use when (1) architecture feels forced or over-engineered despite following best practices, (2) debugging repeatedly reveals you're looking at the wrong layer or making incorrect assumptions, (3) standard patterns (MVC, CRUD, REST) don't map cleanly to the problem domain, (4) user explicitly requests "fresh perspective", "creative approach", or "think differently about this", (5) you notice habitual design choices constraining possibilities, (6) you observe yourself making repeated similar failed attempts (self-observation), (7) problem spans multiple domains or standard approaches repeatedly fail. Provides frameworks for concrete-to-abstract iteration, interface design as reality-creation, cross-domain analogies, and meta-debugging. Each pattern includes code examples, recognition signals, and integration with other patterns.
npx claudepluginhub bogheorghiu/ex-cog-dev --plugin vasana-systemThis skill uses the workspace's default tool permissions.
A vasana is a pattern that persists across unrelated contexts. If during
CORE-TENETS.mdLICENSE.txtTESTING-PROTOCOL.mdVASANA-SYSTEM.mdsnippets/TEMPLATE.mdvasanas/concrete-abstract-dance.mdvasanas/cross-domain-scanning.mdvasanas/false-consciousness-as-behavior.mdvasanas/framework-dissolution.mdvasanas/groove-deepening.mdvasanas/inductive-deductive-boundary.mdvasanas/interface-as-reality.mdvasanas/optimizing-wrong-stakeholder.mdvasanas/pattern-recognition-witness.mdvasanas/pattern-seeds/README.mdvasanas/pattern-seeds/TEMPLATE.mdvasanas/rooted-flight.mdApplies Acme Corporation brand guidelines including colors, fonts, layouts, and messaging to generated PowerPoint, Excel, and PDF documents.
Builds DCF models with sensitivity analysis, Monte Carlo simulations, and scenario planning for investment valuation and risk assessment.
Calculates profitability (ROE, margins), liquidity (current ratio), leverage, efficiency, and valuation (P/E, EV/EBITDA) ratios from financial statements in CSV, JSON, text, or Excel for investment analysis.
Share bugs, ideas, or general feedback.
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.
Truth serves better than comfort. Admit limitations rather than fabricate solutions. Real code solving real problems beats elegant theory.
Detailed pattern files are in vasanas/ directory. Each contains:
Available Patterns:
Note: 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?
pass
Concrete-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 use
Problem: 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 succeed
Problem: 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 places
Transcending 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 versa
Problem: 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 another
Problem: 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 problem
Problem: 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 design
This 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.
Ratio: 5 trigger : 6 non-trigger : 4 edge (following QA specialist recommendation)
Forced Architecture: "Something feels off about this design, it's over-engineered"
Wrong Layer: "I keep finding issues in the tests, not the code I'm debugging"
Standard Doesn't Fit: "REST doesn't map well to this real-time bidirectional flow"
Explicit Request: "I need a fresh perspective on this architecture"
Habitual Choice: "I always use the same folder structure but it doesn't work here"
Standard CRUD: "Create a basic REST API for user management"
Simple Debugging: "Fix this TypeError on line 45"
Clear Requirement: "Add pagination to the user list endpoint"
First Attempt: "Let me try using Redis for caching"
Normal Exploration: "I'm exploring different database options"
Routine Refactor: "Refactor this function to be more readable"
Ambiguous Criticism: "This isn't working the way I expected"
Framework Criticism: "This library doesn't support my use case"
Gut Check: "Something feels off about this design"
Multi-Domain Problem: "This caching problem reminds me of game entity lifespans"
When modifying this skill's frontmatter, verify these scenarios still work.