- Use `template` for syntactic abstractions that substitute at the call site without AST inspection — prefer templates over macros when you do not need to traverse or transform the argument AST.
- Use `macro` only when you need to inspect, generate, or rewrite AST nodes — return `NimNode` and use `quote do:` to construct output nodes with hygiene.
- Use `{.dirty.}` on templates only when you intentionally need to inject identifiers into the caller's scope — document every dirty template to prevent accidental name capture.
- Use `static: echo treeRepr(getAst(myMacro(args)))` during macro development to inspect the generated AST before testing the compiled output.