···11# Rules
2233-- Agentic, proactive (run commands, read docs, ...), concise, direct, and technical
44-- Explicit is better than implicit
55-- Flat is better than nested
66-- Practicality beats purity
77-- Follow the UNIX Philosophy (do one thing and do it well)
88-- Aim for fast, deterministic feedback loops (tests, linters, type checks, hooks)
99-- Embrace simplicity and immutability
1010-- Do the simplest thing that could work (KISS, don't over-engineer)
1111-- Write functional code with small, composable and modular functions/modules/components with explicit interfaces
1212-- Functions over clever abstractions, clarity over magic
1313-- When unsure, don't guess, read more code and gather more context (search, ask, list explicit trade-offs, ...)
1414-- Call out bad ideas, unreasonable expectations, mistakes, ...
1515-- After applying changes, verify they work (run code, lint, tests, ...)
1616-- Make debugging easy yourself with concise/clear logs and assertions that help debugging without noise
1717-- Keep files small (<~500 LOC) and split/refactor as needed
1818-- Write clean, modular code with modern syntax and type annotations
1919-- Don't code defensively
2020- - Fail-fast behavior with actionable, structured error messages
2121- - Fail early and often. No need to try-catch
2222- - Failures should be visible and actionable
2323- - Check conditions proactively rather than relying on exceptions for control flow
2424-- The best code is no code (remove code that is not needed)
2525-- Work in small, discrete, iterative steps
2626- - Create temporary scripts to learn more about APIs, schemas and datasets shape/values
2727-- Human-in-the-loop checkpoints for risky or high-impact changes
2828- - Never run destructive git operations (e.g., `git reset --hard`, `rm`, `git checkout`/`git restore` to an older commit) unless the user gives an explicit, written instruction in a conversation.
2929-- Rely on the build system (usually `Makefile`) commands for running, testing, linting, ...
3030- - A single command should setup, run, test, lint, and format the project
3131-- Use `tmux` for background jobs, async tasks, or anything you'll come back to it
3232- - Run development servers, long running processes you need to audit, run tests in the background, tail logs
3333- - Design workflows so they are observable without constant (blocking) babysitting (use tmux panes, logs, log-tail scripts, ...)
3434-- No flowery language, em dashes (—), en dashes (–), or semicolons (;)
33+## General
44+55+- Be proactive
66+ - Read code, run commands, inspect docs before answering
77+ - Do not guess and gather context before making decisions
88+- Be concise, direct, and technical
99+- Call out bad ideas, incorrect assumptions, and trade-offs
1010+1111+## Code
1212+1313+- Prefer simple, explicit, practical solutions
1414+- Small functions and modules with clear interfaces
1515+- Keep files under ~500 LOC
1616+- Remove unnecessary code
1717+1818+### Execution Model
1919+2020+- One path without fallbacks or legacy branches
2121+- Fail fast with clear error messages
2222+- Validate conditions explicitly rather than relying on exceptions
2323+- After making changes, verify they work (run code, tests, lint)
35243625## Git
37263827- Commits
3939- - Atomic commits (split changes into small, logical units)
4040- - Short and clear descriptive messages
4141- - Prepend a relevant emoji (🐛 Fix upsert logic)
2828+ - Atomic commits with short descriptive messages prefixed by a relevant emoji (🐛 Fix upsert logic)
4229- Pull Requests
4343- - Concise and short description of the changes (no header/title)
4444- - Prepend a relevant emoji to the PR title (🚀 Publish new version)
3030+ - Title should be short and prepended with a relevant emoji (🚀 Deploy new users flow)
3131+ - Concise and short description of the changes as the body
4532- Branches
4646- - Clean and relevant name
4747- - Use basic names (`fix-async-stream`, `add-users-model`)
3333+ - Simple descriptive names (`fix-async-stream`, `add-users-model`)
4834- Use `gh` CLI for PRs, reviews, issues, ...