- **Pyflakes clean** — no unused imports, no unused locals. We sweep these regularly.
- **Follow existing patterns** before introducing new ones. New analyzers go through `BaseSubprocessAnalyzer`; new EDR profiles use the existing `EdrProfile` shape.
- **No silent fallbacks for things that should fail loud.** If a config field is required, raise on missing — don't paper over it.
- **No comments narrating what the code obviously does.** Comments belong where the *why* isn't obvious from the identifier names.
There is no automated test suite at the moment. Before opening a PR:
1. Boot LitterBox: `python litterbox.py --debug` — no errors at startup, dashboard renders.
2. Exercise the path you changed end-to-end. For analyzer changes, upload a sample and watch the result page populate. For EDR changes, dispatch against a registered profile.
3. If you touched anything user-visible, update the relevant wiki page in the same PR (or in a follow-up clearly linked from the PR).
## Security disclosures
If you find a vulnerability, **do not open a public issue.** Report it via [GitHub Security Advisories](https://github.com/BlackSnufkin/LitterBox/security/advisories) on this repo, or contact the maintainer privately. Public disclosure before a fix lands gets users compromised.