The "PR review" Routine reads this file from the base branch of every pull request to this repository. The contract in claude-tools coding/skills/review/SKILL.md sets what counts as a finding and the shape of the review; this file says what matters here. Keep it short: every line competes with the contract for the reviewer's attention.
- A conference entry whose
cfp,start,end,placeorlinkdisagrees with the conference's own website: fetchlink(andcfp_link) and compare. The schema checks formats, not facts, and the site publishes whatever is merged. - A
yearthat differs from the year ofstart, or atimezonethat is not an IANA name: the schema accepts both, andstatic/js/countdown-simple.jsthen falls back to the visitor's own zone without saying so. - An entry that already exists in
_data/conferences.yml,_data/archive.ymlor_data/legacy.ymlunder another spelling of the name. CI only warns, and only on an exact name-and-year match. - A change under
_layouts/,_includes/or_pages/that names an include, layout or asset path that does not exist: no pull-request job builds the site for those paths, so the first failure is the deploy ofmain. - A
utils/change that letssort_yaml.pywrite a data file after a validation error, or drop an entry on the way. The weekly sort (recurring-sort.yml) merges its own result unattended.
- Everything
pixi run sortenforces or rewrites: the pydantic schema inutils/tidy_conf/schema.py(required fields, date and URL formats,subagainst_data/types.yml, a location for in-person events), key order, sort order, years insideconference, redundant link fields and geocoding. After a merge, pr-sort.yml opens the clean-up PR itself. - Everything
pixi run preenforces on Python: ruff, black, isort, pyupgrade, docsig and the pre-commit-hooks set. Quote their output under Tests. - JavaScript style in
static/js/: ESLint runs with|| true; the jest coverage thresholds injest.config.jsare the only enforced bar. - Translations under
_i18n/other thanen: Crowdin owns them (crowdin.yml, TRANSLATION.md), and a direct edit is overwritten by the next sync.
There is no pixi in the Routine sandbox, so run the same checks through uv, pinned the way pixi.toml pins them (Python 3.11, pandas 2.2):
- Data:
uv run --python 3.11 --with "pandas<2.3",pyyaml,pydantic,pytz,thefuzz,iso3166,icalendar,tqdm,requests python utils/sort_yaml.py --skip_links, thengit diff --stat -- _data. A non-zero exit is a finding; a diff is the rewrite the post-merge sort will do, not a finding. - Python, when
utils/ortests/change:uv run --python 3.11 --with "pandas<2.3",pytest,pytest-mock,freezegun,hypothesis,responses,pyyaml,pydantic,pytz,thefuzz,iso3166,icalendar,tqdm,requests pytest tests/ -q -x -p no:cacheprovider. - Lint, when Python changes:
uvx ruff@0.4.4 check utils tests, the version.pre-commit-config.yamlpins (a newer ruff reports dozens of pre-existing errors). The rest of the pre-commit set is thepre-commit.ci - prstatus on the PR: quote it, do not rerun it. - JavaScript, when
static/js/ortests/frontend/change:npm ci && npm test.