Keep Plugin Paths Portable
Point at ${CLAUDE_PLUGIN_ROOT} for shipped files and ${CLAUDE_PLUGIN_DATA} for state. Never a path from your machine.
Where you'll practice this
One Promptles scenario teaches this principle directly.
Make the Hook Work Everywhere
Every edit Marco and Lee make now prints a hook error. Both installed shipkit 0.2.0 from `acme-tools` this morning: Marco, who works on Windows through WSL (a way to run Linux inside Windows), and Lee on a Mac. shipkit's lint hook (a script Claude Code runs after each file edit)…
Other principles in Constraints
Define Component Boundaries
When splitting a component, give the decisions already made and say nothing on screen should change.
Define Inputs and Outputs
Say what goes in, what comes out, and what happens with bad input. Leave the inside to Claude.
Define the Business Logic
Turn business words into exact rules: the fields, the thresholds, and how they combine.
Deprecate Before Removing
Keep the old name working for a release, point to the replacement, and announce when it goes away.
Describe Edge Cases
Name the unusual cases you know about and what should happen in each.
Describe Type Contracts
Tell Claude the rules the code doesn't show, like allowed values and optional fields. It can work out the rest.