diff --git a/CLAUDE.md b/CLAUDE.md index 4dad52b..0196613 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -150,6 +150,13 @@ After every PR (or PR stack) merges to main: - **Library-first UI**: Always prefer existing library components (Taiga UI, Angular CDK) over custom HTML + CSS implementations. Writing custom UI or logic without justification is NG. Taiga UI components are customizable via CSS custom properties (`--tui-*`) — override tokens in `styles.css` rather than reimplementing from scratch. - **Library-source-first debugging (mandatory, not advisory)**: When a library, framework, or infra tool (Dependabot, GitHub Actions, Docker, pnpm) behaves unexpectedly — OR before proposing a fix for a config error in any of these tools — read the official documentation and search the issue tracker for the exact error message **before writing any fix**. This applies to the very first fix attempt, not only after subsequent failures. Empirical trial-and-error without reading the source produces multiple fix commits for the same root cause. Minimum: read the relevant config reference, check the changelog for breaking changes in the version in use, and search GitHub Issues / Discussions for the exact error message. +- **Never state a verification result you did not produce (mandatory)**: Every factual claim written into an issue, PR body, plan, commit message or review — "absent from `git ls-files`", "the build passes", "no commit ever added this file", "all three checks were run" — must come from a command actually executed in the session that writes it. If a check was not run, run it or omit the claim. An unrun check must never appear in the past tense. This is not a stylistic preference: a fabricated claim is indistinguishable from a measured one to every later reader, so it survives review and gets acted on. Issue #126 (since deleted) reported that `SDLC.md` "has never existed in the repo" on three grounds, of which two were written without being executed and were false — the file was present, tracked, and six revisions deep at the time. It was proposed, approved, filed, worked on and closed before anyone opened it. + + Two habits follow: + + - **A single negative probe is not evidence of absence — run the positive control.** The one check #126 did run, `git log --diff-filter=D -- '*SDLC*'`, returned nothing, which proves the file was never *deleted*. It was read as proving the file never existed. `--diff-filter=A` returns the adding commit immediately. Before concluding that something is missing, run the query that would find it if it were there. + - **Verify claims about this repository the way you verify claims about a library.** The rule above applies to `git`, `CLAUDE.md`, `SDLC.md` and the working tree, not only to third-party tools. The repo is simultaneously the easiest primary source to read and the easiest to assume you already know. + ## Testing - **Boundary-first**: Always test application boundaries — HTTP controllers, WebSocket gateways, pipes. Internal service logic is tested only where needed to reach the coverage target.