Release 7/11: tag v0.4.0 and register with r-universe #47

Closed
opened 2026-08-08 18:43:41 -04:00 by jared · 4 comments
Owner

Blocked on #56 (performance pass). Everything mechanical below is ready; this is the go-live gate and it waits for tuning.

Why the ordering matters

r-universe publishes check results the moment a package is registered, and a tag is a durable pointer. Registering before the performance pass means the first thing anyone sees is a version we already intend to improve.

Everything else is green: R CMD check --as-cran 0/0/0, 972 tests offline, 974 against the live corpus, 4/4 platforms on the mirror matrix, cog-api unbroken.

Steps

  • #56 performance pass complete, README latency table re-measured
  • Tag v0.3.0 on Gitea main, confirm the mirror workflow carries the tag to GitHub — this is also the first clean end-to-end run of that workflow
  • Create github.com/civilytics/civilytics.r-universe.dev — the name must be exactly <org>.r-universe.dev
  • Add packages.json pinned to the tag:
    json [ { "package": "uscogdata", "url": "https://github.com/civilytics/uscogdata", "branch": "v0.3.0" } ]
    Point at the GitHub mirror, not Gitea: it keeps clone traffic off the origin and gets webhook-speed rebuilds via the app.
  • Install the r-universe GitHub app on the civilytics org
  • Verify from a clean R session:
    r install.packages("uscogdata", repos = c("https://civilytics.r-universe.dev", "https://cloud.r-project.org"))

Absorbed from other issues

  • Disable Gitea issues (from #43). Deliberately deferred: this tracker holds the release checklist, and disabling it hides the very list being worked through. Do it once this issue closes and the GitHub mirror is the live inbox.
  • CI status badge in the README (from #46) — held back so a dead badge did not sit next to the r-universe one before either resolved. Both resolve here.
  • PR-comment action on the mirror (from #46) explaining the contribution flow: patches land on Gitea, and the PR closes itself as merged when the mirror syncs. Without it, a first-time contributor reads a self-closing PR as rejection. See CONTRIBUTING.md.

Reusable

packages.json lists many repos. The rest of the R package backlog is one line each — which is why it is worth setting up properly once.

**Blocked on #56 (performance pass).** Everything mechanical below is ready; this is the go-live gate and it waits for tuning. ## Why the ordering matters **r-universe publishes check results the moment a package is registered**, and a tag is a durable pointer. Registering before the performance pass means the first thing anyone sees is a version we already intend to improve. Everything else is green: `R CMD check --as-cran` 0/0/0, 972 tests offline, 974 against the live corpus, **4/4 platforms** on the mirror matrix, cog-api unbroken. ## Steps - [ ] **#56 performance pass complete**, README latency table re-measured - [ ] Tag `v0.3.0` on Gitea `main`, confirm the mirror workflow carries the tag to GitHub — this is also the first clean end-to-end run of that workflow - [ ] Create `github.com/civilytics/civilytics.r-universe.dev` — the name must be exactly `<org>.r-universe.dev` - [ ] Add `packages.json` pinned to the tag: ```json [ { "package": "uscogdata", "url": "https://github.com/civilytics/uscogdata", "branch": "v0.3.0" } ] ``` Point at the **GitHub mirror**, not Gitea: it keeps clone traffic off the origin and gets webhook-speed rebuilds via the app. - [ ] Install the r-universe GitHub app on the `civilytics` org - [ ] Verify from a clean R session: ```r install.packages("uscogdata", repos = c("https://civilytics.r-universe.dev", "https://cloud.r-project.org")) ``` ## Absorbed from other issues - [ ] **Disable Gitea issues** (from #43). Deliberately deferred: this tracker holds the release checklist, and disabling it hides the very list being worked through. Do it once this issue closes and the GitHub mirror is the live inbox. - [ ] **CI status badge** in the README (from #46) — held back so a dead badge did not sit next to the r-universe one before either resolved. Both resolve here. - [ ] **PR-comment action** on the mirror (from #46) explaining the contribution flow: patches land on Gitea, and the PR closes itself as merged when the mirror syncs. Without it, a first-time contributor reads a self-closing PR as rejection. See `CONTRIBUTING.md`. ## Reusable `packages.json` lists many repos. The rest of the R package backlog is one line each — which is why it is worth setting up properly once.
jared changed title from Release 6/11: tag v0.3.0 and register with r-universe to Release 7/11: tag v0.3.0 and register with r-universe 2026-08-08 18:44:09 -04:00
jared changed title from Release 7/11: tag v0.3.0 and register with r-universe to Release 7/11: tag v0.3.0 and register with r-universe (blocked on #56) 2026-08-09 09:19:34 -04:00
Author
Owner

The version in this issue's title is stale: it is v0.4.0, not v0.3.0

main moved past 0.3.0 while this issue sat blocked. DESCRIPTION reads Version: 0.4.0
and NEWS.md opens at # uscogdata 0.4.0 — the bump landed with the cohort-predicate
merge (#61 / #58). Tagging v0.3.0 now would put a tag on a tree that already calls
itself something else, and r-universe would register the mismatch.

Retitling accordingly. Nothing else about this issue changes.

What 0.4.0 contains, for the release notes

  • #58 — cohorts named by state/type predicate instead of a 40k-id IN list.
    4.8x, and at the no-filter floor.
  • #57 — limit/offset on cog_gov_search() and cog_balances(), completing the
    pagination surface started in #39. Also fixes cog_gov_search()'s ORDER BY, which was
    not a total order and made a paged sweep unsound.
  • #60 — USCOGDATA_DUCKDB_THREADS / USCOGDATA_DUCKDB_MEMORY_LIMIT, replacing a
    consumer's getFromNamespace() reach into package internals.
  • Windows local-path fix, GitHub mirror + multi-platform R CMD check.
## The version in this issue's title is stale: it is **v0.4.0**, not v0.3.0 `main` moved past 0.3.0 while this issue sat blocked. `DESCRIPTION` reads `Version: 0.4.0` and `NEWS.md` opens at `# uscogdata 0.4.0` — the bump landed with the cohort-predicate merge (#61 / #58). Tagging `v0.3.0` now would put a tag on a tree that already calls itself something else, and r-universe would register the mismatch. Retitling accordingly. Nothing else about this issue changes. ## What 0.4.0 contains, for the release notes - **#58** — cohorts named by `state`/`type` predicate instead of a 40k-id `IN` list. 4.8x, and at the no-filter floor. - **#57** — `limit`/`offset` on `cog_gov_search()` and `cog_balances()`, completing the pagination surface started in #39. Also fixes `cog_gov_search()`'s `ORDER BY`, which was not a total order and made a paged sweep unsound. - **#60** — `USCOGDATA_DUCKDB_THREADS` / `USCOGDATA_DUCKDB_MEMORY_LIMIT`, replacing a consumer's `getFromNamespace()` reach into package internals. - Windows local-path fix, GitHub mirror + multi-platform R CMD check.
jared changed title from Release 7/11: tag v0.3.0 and register with r-universe (blocked on #56) to Release 7/11: tag v0.4.0 and register with r-universe (blocked on #56) 2026-08-10 19:11:31 -04:00
jared changed title from Release 7/11: tag v0.4.0 and register with r-universe (blocked on #56) to Release 7/11: tag v0.4.0 and register with r-universe 2026-08-10 19:39:28 -04:00
Author
Owner

Unblocked. #56 closed — all three gating PRs (#62, #63, #65) are merged and main is at d2caa6d, verified 1084 tests passing and R CMD check --as-cran clean apart from the pre-existing NOTE (whose r-universe 404 is this issue, and clears on registration).

The version to tag is v0.4.0, not v0.3.0 — see the comment above.

**Unblocked.** #56 closed — all three gating PRs (#62, #63, #65) are merged and `main` is at `d2caa6d`, verified 1084 tests passing and `R CMD check --as-cran` clean apart from the pre-existing NOTE (whose r-universe 404 is this issue, and clears on registration). The version to tag is **v0.4.0**, not v0.3.0 — see the comment above.
Author
Owner

Tagged. Two steps left, and both need you.

Done

v0.4.0 tagged on Gitea and mirrored. Annotated tag on d2caa6d, pushed to
origin. The mirror workflow fired on the tag and this is its first clean end-to-end
run
, which this issue wanted verified:

tags on github.com/civilytics/uscogdata: v0.4.0
github HEAD: d2caa6de970134890b97def3e882dd00bc68daa3
gitea  HEAD: d2caa6de970134890b97def3e882dd00bc68daa3

Tag present, HEADs identical, no force push needed. The non-force design held.

Absorbed items — PR #66: the R-CMD-check badge (pointing at the mirror's workflow,
where the 4-platform matrix actually runs) and the pull_request_target explainer that
tells contributors a self-closing "Merged" PR is the successful outcome, not a rejection.
Also added to CONTRIBUTING.md's release checklist: the tag goes on Gitea and the mirror
carries it, and r-universe will not pick up a release until packages.json's pin is
edited
— "*release" would automate that but needs a GitHub Release object, and the
mirror pushes tags only, so it would silently never update. Worth one sentence now.

Blocked on you — step 1: create the registry repo

gh repo create was refused by my sandbox's permission policy, so I have not created it.
Contents are ready; this is two commands:

gh repo create civilytics/civilytics.r-universe.dev --public \
  --description "r-universe registry for Civilytics R packages"

with packages.json:

[
  {
    "package": "uscogdata",
    "url": "https://github.com/civilytics/uscogdata",
    "branch": "v0.4.0"
  }
]

Note this is v0.4.0, not the v0.3.0 in the checklist above — main moved past
0.3.0 with the cohort-predicate merge.

I also drafted a README for that repo explaining the two conventions worth not
re-deriving (point at the mirror not Gitea; pin to a tag, and why *release cannot work
here). Staged locally at
scratchpad/r-universe-registry/ — say the word and I will paste it into a PR once the
repo exists.

Blocked on you — step 2: install the r-universe GitHub app

Inherently interactive (browser OAuth on the civilytics org). Nothing I can do from
here.

Then the last checkbox

Once both are done, r-universe builds within ~15 minutes and this verifies:

install.packages("uscogdata",
  repos = c("https://civilytics.r-universe.dev",
            "https://cloud.r-project.org"))

Until then the r-universe badge in the README and the Docs link on the /r-packages card
both 404 — expected, and they resolve the moment the registry is live. That is also the
NOTE R CMD check --as-cran reports.

Still deferred, correctly

Disabling Gitea issues stays deferred: this tracker holds #50, #51 and #52, and
disabling it now hides the list still being worked. Do it when those close.

## Tagged. Two steps left, and both need you. ### Done **`v0.4.0` tagged on Gitea and mirrored.** Annotated tag on `d2caa6d`, pushed to `origin`. The mirror workflow fired on the tag and this is its **first clean end-to-end run**, which this issue wanted verified: ``` tags on github.com/civilytics/uscogdata: v0.4.0 github HEAD: d2caa6de970134890b97def3e882dd00bc68daa3 gitea HEAD: d2caa6de970134890b97def3e882dd00bc68daa3 ``` Tag present, HEADs identical, no force push needed. The non-force design held. **Absorbed items — PR #66:** the R-CMD-check badge (pointing at the mirror's workflow, where the 4-platform matrix actually runs) and the `pull_request_target` explainer that tells contributors a self-closing "Merged" PR is the successful outcome, not a rejection. Also added to `CONTRIBUTING.md`'s release checklist: the tag goes on Gitea and the mirror carries it, and **r-universe will not pick up a release until `packages.json`'s pin is edited** — `"*release"` would automate that but needs a GitHub *Release* object, and the mirror pushes tags only, so it would silently never update. Worth one sentence now. ### Blocked on you — step 1: create the registry repo `gh repo create` was refused by my sandbox's permission policy, so I have not created it. Contents are ready; this is two commands: ```sh gh repo create civilytics/civilytics.r-universe.dev --public \ --description "r-universe registry for Civilytics R packages" ``` with `packages.json`: ```json [ { "package": "uscogdata", "url": "https://github.com/civilytics/uscogdata", "branch": "v0.4.0" } ] ``` Note this is **`v0.4.0`**, not the `v0.3.0` in the checklist above — `main` moved past 0.3.0 with the cohort-predicate merge. I also drafted a README for that repo explaining the two conventions worth not re-deriving (point at the mirror not Gitea; pin to a tag, and why `*release` cannot work here). Staged locally at `scratchpad/r-universe-registry/` — say the word and I will paste it into a PR once the repo exists. ### Blocked on you — step 2: install the r-universe GitHub app Inherently interactive (browser OAuth on the `civilytics` org). Nothing I can do from here. ### Then the last checkbox Once both are done, r-universe builds within ~15 minutes and this verifies: ```r install.packages("uscogdata", repos = c("https://civilytics.r-universe.dev", "https://cloud.r-project.org")) ``` Until then the r-universe badge in the README and the `Docs` link on the /r-packages card both 404 — expected, and they resolve the moment the registry is live. That is also the NOTE `R CMD check --as-cran` reports. ### Still deferred, correctly **Disabling Gitea issues** stays deferred: this tracker holds #50, #51 and #52, and disabling it now hides the list still being worked. Do it when those close.
Author
Owner

Registered and published. Verified end to end.

civilytics.r-universe.dev is live and uscogdata 0.4.0 is on it. Registry repo
and GitHub app were both done by @jared; everything below is verification of the
result, not of the setup.

Built from the tag, on every platform

r-universe built the tagged commit, not a moving main — confirming the pin
did its job:

_commit  d2caa6de970134890b97def3e882dd00bc68daa3   (= v0.4.0)
_status  success        _failure  none

8/8 builds green: linux R 4.7.0 / 4.6.1, mac R 4.6.1 / 4.5.3, win R 4.7.0 /
4.6.1 / 4.5.3, wasm R 4.6.0.

The last checkbox — install from a clean library

Installed into a scratch lib with the user library left untouched, so this is a
real resolve-and-build from the repo, not a local package being found first:

install.packages("uscogdata",
  repos = c("https://civilytics.r-universe.dev",
            "https://cloud.r-project.org"))
* DONE (uscogdata)
packageVersion  0.4.0
Repository      https://civilytics.r-universe.dev

Both badges resolve, and both are green

They were 404 until the registry existed; they now render:

  • r-universe: 0.4.0 — note the badge URL in the README 301-redirects to
    /uscogdata/badges/version. Harmless (GitHub's image proxy follows it), just
    don't be surprised by the redirect when testing it with curl and no -L.
  • R-CMD-check: passing — title string is literally R-CMD-check - passing.

Docs, and why #49 stays closed

_pkgdown is null in the build metadata, which looks at first glance like the
docs did not render. It is not — r-universe builds its own doc pages rather
than a pkgdown site, and both vignettes are there:

200  /uscogdata/doc/manual.html
200  /uscogdata/doc/total-spending.html
200  /uscogdata/doc/population-denominators.html

So the Docs link on the /r-packages card resolves, and #49's reasoning — that
r-universe renders docs from the tag, so a second branded site is redundant —
holds up against the actual build rather than against the plan.

One step left, and it needs you

PR #66 is CI-green and unmerged. My sandbox refused the merge. It carries the
R-CMD-check badge, the pull_request_target mirror-PR explainer, and the
CONTRIBUTING note that r-universe will not pick up a release until this
registry's branch pin is edited by hand.

combined state: success
  success | R-CMD-check / check (pull_request)
  success | R-CMD-check / check (push)

Worth knowing: v0.4.0 was tagged before #66, so the README that r-universe
renders on the package page is the pre-badge one. That corrects itself at the
next release and is not worth re-tagging for.

Still deferred, still deliberately

Disabling the Gitea issue tracker stays deferred while #50, #51 and #52 are open
on it. Do it when they close, not now.

## Registered and published. Verified end to end. `civilytics.r-universe.dev` is live and `uscogdata 0.4.0` is on it. Registry repo and GitHub app were both done by @jared; everything below is verification of the result, not of the setup. ### Built from the tag, on every platform r-universe built the **tagged commit**, not a moving `main` — confirming the pin did its job: ``` _commit d2caa6de970134890b97def3e882dd00bc68daa3 (= v0.4.0) _status success _failure none ``` 8/8 builds green: linux R 4.7.0 / 4.6.1, mac R 4.6.1 / 4.5.3, win R 4.7.0 / 4.6.1 / 4.5.3, wasm R 4.6.0. ### The last checkbox — install from a clean library Installed into a scratch `lib` with the user library left untouched, so this is a real resolve-and-build from the repo, not a local package being found first: ```r install.packages("uscogdata", repos = c("https://civilytics.r-universe.dev", "https://cloud.r-project.org")) ``` ``` * DONE (uscogdata) packageVersion 0.4.0 Repository https://civilytics.r-universe.dev ``` ### Both badges resolve, and both are green They were 404 until the registry existed; they now render: - `r-universe: 0.4.0` — note the badge URL in the README 301-redirects to `/uscogdata/badges/version`. Harmless (GitHub's image proxy follows it), just don't be surprised by the redirect when testing it with `curl` and no `-L`. - `R-CMD-check: passing` — title string is literally `R-CMD-check - passing`. ### Docs, and why #49 stays closed `_pkgdown` is `null` in the build metadata, which looks at first glance like the docs did not render. It is not — r-universe builds its **own** doc pages rather than a pkgdown site, and both vignettes are there: ``` 200 /uscogdata/doc/manual.html 200 /uscogdata/doc/total-spending.html 200 /uscogdata/doc/population-denominators.html ``` So the `Docs` link on the /r-packages card resolves, and #49's reasoning — that r-universe renders docs from the tag, so a second branded site is redundant — holds up against the actual build rather than against the plan. ### One step left, and it needs you **PR #66 is CI-green and unmerged.** My sandbox refused the merge. It carries the R-CMD-check badge, the `pull_request_target` mirror-PR explainer, and the CONTRIBUTING note that r-universe will not pick up a release until this registry's `branch` pin is edited by hand. ``` combined state: success success | R-CMD-check / check (pull_request) success | R-CMD-check / check (push) ``` Worth knowing: v0.4.0 was tagged **before** #66, so the README that r-universe renders on the package page is the pre-badge one. That corrects itself at the next release and is not worth re-tagging for. ### Still deferred, still deliberately Disabling the Gitea issue tracker stays deferred while #50, #51 and #52 are open on it. Do it when they close, not now.
jared closed this issue 2026-08-11 09:44:53 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Civilytics/uscogdata#47