Files
civilyticsR/AGENTS.md
T
jared cd1af67a3a fix(packaging): exclude scoped chore and docs commits from roborev
The exclusion patterns are substring matches, so `chore:` never matched
`chore(packaging):`. Because the cadence rule in AGENTS.md mandates the
`type(ws):` scope, every chore and docs commit was being reviewed -- job 15
spent a thorough review on a config-only commit. Adds the `chore(` and `docs(`
forms.

Also names pm/compass.toml as authoritative for the review rules, so the
prose copy in AGENTS.md cannot silently drift from the generated
.roborev.toml. Raised by roborev job 15.
2026-08-24 00:13:23 -04:00

4.1 KiB

AGENTS.md

civilytics is the house R package for Civilytics Consulting: a ggplot2 brand theme system, curated palettes, logo composition, Quarto/Typst/Reveal templates, and data-wrangling helpers for public-sector analysis. It is a library other projects depend on, so a breaking change here breaks reports that are already published.

Project tracking

This repo is managed with compass. pm/compass.toml defines the workstreams; pm/JOURNAL.md records sessions; pm/decisions/ holds numbered, immutable decision records. Ask compass where things stand rather than reading the config back.

Workstreams (the ws/ label on every issue):

ws/ covers
theme R/theme.R, R/colors.R, R/fonts.R — themes, palettes, font loading
logo R/logo.R, R/flextable.R, inst/img/ — logo and branded output
quarto R/quarto.R, inst/quarto/ — HTML, PDF, Typst, Reveal templates
helpers R/utils.R, R/prop_conf.R, R/join_utilities.R, R/db.R, R/notifications.R
packaging DESCRIPTION, NAMESPACE, Makefile, Dockerfile, .gitea/workflows/

Commit cadence

One coherent unit per commit, subject line:

type(ws): subject (#N)

type is one of feat, fix, refactor, docs, test, chore, perf, ci. ws is a workstream id from the table above. #N is the issue, when there is one.

Conventions

pm/compass.toml is authoritative for these rules. Its [roborev] project_guidelines are composed into .roborev.toml, so change them there and re-run compass rather than editing .roborev.toml by hand. The prose below is the same rules stated for a human reader; if the two ever disagree, pm/compass.toml wins.

Dependencies. Base R plus ggplot2 (>= 4.0), grid/gridExtra, png/jpeg, stringr, stringdist, showtext/sysfonts, jsonlite. No tidyverse: no dplyr, purrr, magrittr, tibble, or data.table. Prefer an existing dependency or base R over adding one — this package is installed into other people's environments.

Brand colors live in civilytics_colors and nowhere else. Never write a hex literal in theme, scale, logo, or table code. (R/flextable.R still carries off-brand Bootstrap defaults; that is known debt, not a pattern to copy.)

Themes default to a transparent background (paper_bg = FALSE) so plots composite onto any Quarto, Reveal, or Typst background. Thread ink, paper, and accent into ggplot2 4.0's base-theme parameters rather than setting element colors one at a time. ggplot2 >= 4.0 is a hard dependency, so use S7 @ property access on plot and theme objects, not $.

Naming. New functions are snake_case. The camelCase exports (countCleanr, dbSafeNames, simpleCap, waldInterval, countDots, countNA, findDots, nvals) are frozen public API — do not rename them.

Documentation. Roxygen generates both man/ and NAMESPACE. Declare imports with @importFrom in the roxygen block; never hand-edit NAMESPACE. Every exported function needs @param for each argument and @return; exported API needs @examples. Re-run roxygen in the same commit as the code change — compass files documentation debt when code moves and its man/ pages do not.

Output. User-facing progress goes through message() so callers can suppress it. No cat() or print() in package code.

Assets. Nothing personal or client-identifying is vendored into inst/ — brand assets only. Version 0.3.2 removed headshots for exactly this reason.

Testing

testthat edition 3, one file per source file (tests/testthat/test_theme.R etc.). Tests are self-sufficient: no reliance on state left by an earlier test. New behaviour needs a test; a bug fix needs a test that fails without the fix.

make check          # R CMD check --no-manual against a built tarball
Rscript -e 'devtools::test()'

CI runs R CMD check on rocker/r-ver:4.6 via .gitea/workflows/check.yaml for every push and PR to master.

Release

Bump Version in DESCRIPTION and add a NEWS.md entry under New features, Bug fixes, or Internal. NEWS.md is the changelog; compass tracks the work that led to it, not the release itself.