tulpaObs 0.0.230
-
ms_abun()registered forsbc()(#220, the 27th and
final family of the original registration scope). Needed TWO upstream
tulpaengine changes before it could even be attempted:tulpa#398(blup_cross): exposestulpa_re_aghq()'s per-group
mode/theta cross-Hessian.- A second gap found while wiring this family:
tulpa_re_aghq()also
only ever exposed the per-RE-TERM DIAGONAL of a group's posterior
covariance (blup_var).ms_abun()'s lambda (abundance) and p
(detection) arms share a per-species grouping factor with real
cross-arm posterior covariance -- the same lambda/p identifiability
ridgetobs()'s penalized-EM exists to break for occupancy psi/p --
so drawing a species' abundance and detection deviations
independently would repeat the#226bug one level deeper (inside a
species instead of between the community mean and a species). Fixed
upstream by addingblup_cov_g/blup_cross_g(the full per-group
joint covariance/cross-Hessian, unsliced by RE term), validated
against a closed-form joint-Hessian construction on a toy model with
deliberately collinear RE terms.
ms_community$Cinv/Bfnow thread offblup_cov_g/blup_cross_g
(R/ms_abun.R), matching the convention every othersbc()-registered
community family uses. Only reachable via the AGHQ/joint_fd engine
(control = list(optimizer = "joint_fd", n.quad > 1)) -- the default
n.quad = 1Laplace-EM path (a different, faster engine entirely) does
not exposeCinv/Bfat all, and errors with a pointer rather than
silently drawing an independent(mu, b_s).Registered at reduced
n.sim = 15(distsamp_open's own precedent for the
identical cost problem, see0.0.227below): an.sim = 100run at
standard settings was projected to take >12h; the actualn.sim = 15run
completed in 39.9 min. Posterior calibrates cleanly (min p_unif 3.9e-3,
0/40 quantities below 1e-3); narrow control's minimum p_unif is 2.9e-12
(comfortably below the 1e-3 pass bar every sibling family uses), though
one narrow-arm quantity did not fail as comprehensively as siblings'
(max p_unif 1.3e-2 there, vs ~1e-6 to 1e-15 elsewhere) -- not
re-investigated given the ~40min cost of a re-run, and does not weaken
the primary (posterior) calibration signal.All 27 originally-scoped families are now registered for
sbc(). -
Engine pin raised to tulpa 0.0.198 (Imports floor and
Remotestag
together, as.github/scripts/check-engine-pin.Rrequires). That release
carries both engine changes thems_abun()registration above depends on:
blup_cross(gcol33/tulpa#398) and the full per-group joint covariance
blup_cov_g/blup_cross_g. The floor and the tag had also drifted apart
from each other (0.0.197 vs v0.0.196), which the pin check fails on.
Tagged before CI ran green. Every workflow run from 2026-08-11 to 2026-08-15
stopped at pak dependency resolution, so the test suite had not executed
against this code. Three defects were sitting behind that, all of them
test-side or in generated documentation: the sbc() registry test's
rank-enumerating slice helper, that test's missing ms_abun()
.sbc_reg_means() branch, and a stale man/dot-tobs_community_em.Rd.
Package behaviour is unaffected.
Use v0.0.232, the first version in this sequence with smoke (4936
assertions, 0 failures, 0 errors) and R CMD check (Status: OK) both
passing.