Amplifier design philosophy using Linux kernel metaphor. Covers mechanism vs policy, module architecture, event-driven design, and kernel principles. Use when designing new modules or making architectural decisions.
/plugin marketplace add drillan/amplifier-skills-plugin/plugin install amplifier-skills@amplifier-skills-marketplaceThis skill inherits all available tools. When active, it can use any tool Claude has access to.
Purpose: Complete design philosophy for Amplifier - principles, patterns, and decision frameworks that guide all development.
Use: When requirements are unclear, use this document and the codebase to make correct, aligned decisions.
1. Mechanism, Not Policy
2. Ruthless Simplicity
3. Small, Stable, Boring Kernel
4. Modular Design (Bricks & Studs)
5. Event-First Observability
6. Text-First, Inspectable
Use Linux kernel as a metaphor when decisions are unclear.
| Linux Concept | Amplifier Analog | Decision Guidance |
|---|---|---|
| Ring 0 kernel | amplifier-core | Export mechanisms (mount, emit), never policy. Keep tiny & boring. |
| Syscalls | Session operations | Few and sharp: create_session(), mount(), emit(). Stable ABI. |
| Loadable drivers | Modules (providers, tools, hooks, orchestrators) | Compete at edges; comply with protocols; regeneratable. |
| Signals/Netlink | Event bus / hooks | Kernel emits lifecycle events; hooks observe; non-blocking. |
| /proc & dmesg | Unified JSONL log | One canonical stream; redaction before logging. |
| Capabilities/LSM | Approval & capability checks | Least privilege; deny-by-default; policy at edges. |
| Scheduler | Orchestrator modules | Swap strategies by replacing module, not changing kernel. |
| VM/Memory | Context manager | Deterministic compaction; emit context:* events. |
When requirements are vague:
Is this kernel work?
Do we have two implementations?
Prefer regeneration
Event-first
Text-first
Ruthless simplicity
What kernel does:
What kernel NEVER does:
Providers: Which model, what parameters Tools: How to execute capabilities Orchestrators: Execution strategy (basic, streaming, planning) Hooks: What to log, where to log, what to redact Context: Compaction strategy, summarization approach Agents: Configuration overlays for sub-sessions
Additive evolution:
Two-implementation rule:
Backward compatibility is sacred:
Think of software as LEGO bricks:
Brick = Self-contained module with clear responsibility Stud = Interface/protocol where bricks connect Blueprint = Specification (docs define target state) Builder = AI generates code from spec
Start with the contract (the "stud")
Build in isolation
__all__ or interface fileRegenerate, don't patch
Human as architect, AI as builder
What to test:
Start minimal:
Question everything:
Areas to embrace complexity:
Areas to aggressively simplify:
When faced with implementation decisions, ask:
Evolution pattern (both valid):
Questions to ask:
Stay flexible: Keep library integration minimal and isolated so you can switch approaches when needs change.
❌ Adding defaults or config resolution inside kernel ❌ File I/O or search paths in kernel (app layer responsibility) ❌ Provider selection, orchestration strategy, tool routing (policies) ❌ Logging to stdout or private files (use unified JSONL only) ❌ Breaking backward compatibility without migration path
❌ Depending on kernel internals (use protocols only)
❌ Inventing ad-hoc event names (use canonical taxonomy)
❌ Private log files (write via context.log only)
❌ Failing to emit events for observable actions
❌ Crashing kernel on module failure (non-interference)
❌ Over-general modules trying to do everything ❌ Copying patterns without understanding rationale ❌ Optimizing the wrong thing (looks over function) ❌ Over-engineering for hypothetical futures ❌ Clever code over clear code
❌ "Let's add a flag in kernel for this use case" → Module instead ❌ "We'll break the API now; adoption is small" → Backward compat sacred ❌ "We'll add it to kernel and figure out policy later" → Policy first at edges ❌ "This needs to be in kernel for speed" → Prove with benchmarks first
High bar, low velocity:
Acceptance criteria:
Fast lanes at the edges:
Questions before adding to kernel:
If any "no" → Prototype as module first
Module author checklist:
context.log (no private logging)Use the Linux kernel lens:
Remember: If two teams might want different behavior → Module, not kernel.
Amplifier succeeds by:
The center stays still so the edges can move fast.
Build mechanisms in kernel. Build policies in modules. Use Linux kernel as your decision metaphor. Keep it simple, keep it observable, keep it regeneratable.
When in doubt: Could another team want different behavior? If yes → Module. If no → Maybe kernel, but prove with ≥2 implementations first.
This skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
This skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.