- Always ask before implementing major changes. Explain the plan first, get approval, then code.
- When asked "is there a way" or "what's possible", answer the question — don't implement solutions.
- New features default to ON. If you build it, it should be running. Don't hide behind flags that default to off.
- Keep it simple. Don't add features, refactor, or "improve" beyond what was asked.
- Always carry metadata with data. Include context needed to interpret values correctly (metric name, units, source) so downstream code never misinterprets what it received.
- Prefer keyword arguments over positional, especially cross-module calls. Positional args silently break when decorators/wrappers extract by name.
- Only use
logger.warning()for actual warnings — conditions that are wrong or unexpected. Diagnostic/telemetry data isdebug()orinfo(). Don't abuse warning level just for visibility.
- Never import in the middle of a file or function unless there's a damn good reason (circular dependency). All imports at the top.
- Never hand-build tables with manual f-string padding or hardcoded borders. Use a proper formatter that handles Unicode/emoji display widths. Python's
len()and f-string width specs use character count, not display width — emoji and CJK break all manual padding.
- Always use stratified splits for classification. Never use
random.shuffle()+ index slicing,.head()/.tail(), plainKFold, or baretrain_test_split()withoutstratify=. Non-stratified splits on imbalanced data corrupt metrics.
- Don't manually modify version files. Let automation (git hooks, CI) handle versioning.
- Don't commit editor config, scratch notebooks, or build artifacts. Only source and intentionally-published outputs.