# CLAUDE.md — Project Conventions ## File Operations - When asked to edit a file, use Glob/Grep to locate it rather than asking the user for the path. - Prefer targeted reads (offset + limit) over reading entire large files. - Before creating a new file, check whether a suitable one already exists. - Do not re-read a file after editing it to verify — edits would have errored if they failed. ## Editing Conventions - When editing R/Quarto files, check for stale object/column name references after renames (e.g., `title` -> new name) across the entire file, not just the edit site. - Make the minimal change needed — do not refactor or clean up surrounding code unless asked. - Do not add comments, docstrings, or type annotations to code you did not change. - Avoid backwards-compatibility shims for removed code; delete unused code outright. ## R Conventions - This project uses data.table, not data.frame/dplyr. Always use data.table syntax (e.g., `DT[, .(col)]`, `:=`) and verify column access patterns work on data.table objects before finalizing edits. - Use `set*` functions (`setnames`, `setorder`, `setkey`) for in-place mutations to avoid copies. - Prefer `fread`/`fwrite` over `read.csv`/`write.csv`. - Do not load tidyverse or dplyr unless explicitly requested. ## Performance / Memory - Large datasets hit R memory limits — prefer chunking, avoid unnecessary copies, and add defensive guards for list vs data.table structures before `rbindlist`. - Never use `rbind` in a loop; accumulate results in a list and call `rbindlist` once. - Avoid `apply`-family functions on large data.tables; use vectorized data.table operations instead. - Check `object.size()` / `lobstr::obj_size()` when debugging memory issues rather than guessing. ## Token Efficiency - Do not summarize what you just did at the end of a response — the diff is visible. - Do not repeat back the user's request before answering. - Skip pleasantries and filler phrases ("Great question!", "Certainly!", etc.). - When reading code to answer a question, read only the relevant section, not the whole file. - Use `files_with_matches` output mode for Grep unless line content is needed.