← Back to all sparks
T

tulpaObs

ANALYTICS
Velocity6.3

Bayesian Occupancy Models via 'tulpa'

An occupancy-modeling package that just deleted its own duplicate vocabulary for diagnostics.

occupancy-modelingbayesian-inferencecalibrationbreaking-changediagnosticsr-package
Current state
tulpaObs is the ecological occupancy and abundance modeling layer built on the tulpa engine, releasing at high frequency and with version numbers that do not advance monotonically in publication order. The current window covers three strands: a breaking consolidation of its diagnostic surface onto generics the engine now owns, the completion of simulation-based-calibration registration across all 27 model families, and a correctness fix that materially moves previously reported information criteria. Several releases exist only to pin a new engine version and record what that change does when measured from this side.
Where it's heading
The package is systematically removing the parallel names it had accumulated for concepts owned elsewhere, and the registration work is closing rather than expanding — the SBC scope reached its final family in this window. Its cadence is tightly coupled to the engine's, to the point where the interesting content of some releases is a dependency floor plus a measurement. With the breaking rename and the registration scope both behind it, the surface work looks close to finished.
Prediction
Expect the follow-on releases to be consolidation rather than expansion — registry branches, regenerated documentation, engine pins — with the next substantive move most likely a new model family beyond the original registration scope.

Recent moves

  1. 1d ago

    AGENTS.md added as the Codex-facing counterpart to CLAUDE.md

    Adds an AGENTS.md carrying the same contract as the existing CLAUDE.md, listed in .Rbuildignore so R CMD check does not flag a non-standard top-level file. Repository housekeeping with no effect on the package's behavior or interface. It sits at the tail of a window otherwise occupied by registry and correctness work.

    View source ↗
  2. 1d ago

    SBC helper now handles any response rank, fixing 4D families

    The SBC registry's slice helper enumerated response ranks explicitly, so ms_dyn_occu()'s four-dimensional response fell through to the 2D branch and errored outright. Since every registered family pools on the first axis, the helper now indexes axis 1 at any rank, which stops the enumeration going stale the next time a family arrives with a new response shape. A regenerated Rd file clears a codoc warning left over from an earlier engine change.

    View source ↗
  3. 1d ago

    ms_abun() registered for SBC, closing the 27-family scope

    The last family of the original SBC registration scope lands, and it needed two upstream engine changes first: the cross-Hessian block, and a fix for the per-group posterior covariance that previously exposed only the diagonal. Without the second, a species' abundance and detection deviations would have been drawn independently across a real identifiability ridge. Meaningful as the closing increment of a long registration grind rather than as a change of direction.

    View source ↗
  4. 1d ago

    SBC registry gains the ms_abun() ranked-quantity branch

    Community families rank the per-species realized coefficient rather than the community mean, so each needs its own branch in the registry's means helper; ms_abun() was registered without one and returned a 2-length vector against an expected 40. The branch is added mirroring ms_distance(), and all eight community families now have one. Published minutes before the release that registered the family, one of several places where this package's version order and publication order disagree.

    View source ↗
  5. 5d ago

    Every diagnostic becomes one verb dispatched on the fit (breaking)

    ⚡ SPARK

    The release that resolves this package's longest-running duplication: the tobs_* diagnostic spellings are gone, replaced by S3 methods on generics owned by loo and the tulpa engine. It is the downstream half of the engine's generics conversion published a minute earlier, and it is what makes the two packages read as one stack rather than two vocabularies. Breaking for anyone calling the old names.

    View source ↗
  6. 5d ago

    Information criteria now score random effects the fit carried

    On the grid-integrated route, occu_cover() had been scoring observation-arm and occupancy-arm random effects at the population mean across WAIC, LOO, CPO, PPC and PIT; both now reach the criteria through the same per-visit and per-site offset path the sampled route uses. The correction moves published numbers substantially — one detection-arm case shifts elpd_waic from -17.9 to -6.4. Fits carrying no random effect are unchanged, which bounds who is affected.

    View source ↗