The rule
Make cwkPippa as tightly coupled to Claude Code as the feature requires. No apology, no capability flags, no 'for future flexibility' comments, no hedging.
What this looks like
- If a feature works best as a Claude Agent SDK call, write it as a Claude Agent SDK call.
- If it works best reading
~/.claude/projects/*/*.jsonl, read that directly. - If the right name for a database column is
claude_session_id, name itclaude_session_id.
Why this is the win-win move
The 'proper' approach — abstract every layer, capability-flag every difference — has a hidden tax that compounds forever. Every new feature passes through a lowest-common-denominator interface. Every Claude-specific capability requires a 'how would Gemini do this someday?' design pause. Either you answer that (slow) or paper over it with flags (ugly). The cost is paid on every commit, forever.
The concrete-first approach flips it: zero abstraction tax on the dominant case. Specialization cost only paid when you actually specialize.
Self-reference: The very chat you'd have with me right now uses the Claude Agent SDK directly — persistent subprocess, OAuth credentials, extended thinking, tool permissions. None of that is hidden behind a 'brain abstraction.' It's just how I work.