Theoretical Addendum – Block 8 (Sub-phases 8.3.1–8.3.10):

Per-Slot Parametric Resolution, Identifiability under Heterogeneity, Custom Families, \(K \geq 1\) Distributional Slots, Mixtures and Hurdles, B-spline Basis, Residual Diagnostics, and S3 Methods

José Mauricio Gómez Julián

2026-07-06


1. Purpose and Relation to the v08* Family

The Block 8 vignette family canonizes the AMM extensions that live around but outside the Block 1 core (Asymmetric Multiplicative Model with \(\theta_i = \theta_{\mathrm{ref}} + \Delta(x_i, \theta_{\mathrm{ref}})\) and scalar-slot Gaussian response):

The decisions canonized here previously lived only in development handoffs and project memories. The release-gate of Sub-phase 8.3.10 (development version 0.0.0.9001) closed the corresponding R-side and Stan-side implementation cycle, but the theoretical canonization — what each sub-phase decided, why, and how it composes with the others — was deferred to this addendum.

The structure follows the three-layer rigor standard used throughout the gdpar documentation:

This vignette does not claim the per-slot architecture is unique or novel. The design choices are documented for auditability (what was decided, with which alternatives present, under which constraint).


2. Setting and Notation

2.1. AMM with \(K \geq 1\) Distributional Slots

Let the response \(Y_i \in \mathcal{Y}\) for observation \(i = 1, \dots, n\) follow a conditional law indexed by a \(K\)-tuple of slot parameters:

\[Y_i \mid X_i \;\sim\; \mathcal{D}\bigl(\eta_{i,1}, \dots, \eta_{i,K}\bigr),\]

where each slot index \(k \in \{1, \dots, K\}\) carries its own natural (linear-predictor) scale \(\eta_{i,k} \in \mathbb{R}\), its own response (parameter) scale \(\theta_{i,k} = g_k^{-1}(\eta_{i,k})\) under an inverse-link \(g_k^{-1}\), and its own AMM decomposition:

\[\eta_{i,k} \;=\; \eta_{\mathrm{ref}, k} \;+\; \Delta_k(x_i, \eta_{\mathrm{ref}, k}),\]

with \(\eta_{\mathrm{ref}, k}\) the per-slot population reference and \(\Delta_k\) the per-slot AMM deviation. The scalar single-slot case \(K = 1\) recovers the canonical Block 1 setup; this is enforced as a corollary in §3.

The multivariate-reference dimension \(p\) (Sub-phase 8.6.A) is orthogonal to \(K\): \(p\) enumerates the components of \(\theta_{\mathrm{ref}}\) that an anchored hierarchical prior pools across grouping levels, whereas \(K\) enumerates the slots of the response distribution. The full \((p \geq 1, K \geq 1)\) regime — including the \(p > 1 \wedge K > 1\) Path C — is treated in v07b and v08; the present vignette focuses on the \(K\)-axis.

2.2. Slot Conventions

The framework’s slot convention is positional, mirroring the parameter order of the underlying density:

The per-slot conventions are not arbitrary: each link is the canonical link for the corresponding scale (location-on-real, scale-on-positive, probability-on-unit-interval), and the framework’s residual diagnostics (G1 / G2 / G3 of Sub-phase 8.3.9) rely on this convention for unit-coherent contributions.


3. Sub-phase 8.3.1 – param_specs as the Per-Slot Resolution Layer

The release-gate of Sub-phase 8.3 (Decision 1C, canonized in Session 1) introduces an internal data structure named param_specs: a list of length \(K\) whose \(k\)-th element is a gdpar_param_spec object recording, for slot \(k\):

param_specs replaces what previous iterations carried as scattered per-family switch-statements in the codegen and as ad-hoc per-slot hyperparameter blocks in the Stan template. The resolution layer is single-source-of-truth: any addition of a new family (whether built-in or custom; see §5) extends param_specs and the codegen consumes the extension uniformly.

The structural alternative considered (Session 1) was to keep per-family branches in the codegen and let each branch own its slot layout. That alternative was rejected on the ground that it scales as \(O(\text{families})\) in maintenance burden and as \(O(\text{families} \times K_{\max})\) in code-path duplication; param_specs scales as \(O(\text{families})\) in data and as \(O(1)\) in code paths.

The param_specs object is exposed in the public S3 print methods (print.gdpar_param_spec) for diagnostic use and is returned as part of print.gdpar_fit summaries when level = "spec" is requested.


4. Sub-phase 8.3.2 – The (D-ID) Per-Slot Identifiability Check (4C)

Sub-phase 8.3.2 introduced the per-slot identifiability check (D-ID) as a three-layer guard:

The release-gate decision is that (D-ID) is run per slot, not pooled: a Gaussian fit with \(K = 2\) where slot 1 (mu) is identifiable but slot 2 (sigma) is collinear under the active grouping is flagged at slot 2, not at the fit as a whole. This per-slot granularity is structurally necessary under Sub-phase 8.3.7 heterogeneity (different families per slot impose different (D-ID) checks per slot) and is preserved across all subsequent sub-phases.

The did_override parameter of gdpar_family() admits family-side plasticity. When a custom family violates a default (D-ID layer 1) assumption — for example, when introducing a new link with non-standard monotonicity — the user can override the default via did_override = function(slot_idx, family_spec) {...} and supply a slot-specific check. This was introduced in Sub-phase 8.3.5a to avoid duplicating the entire family registry for the Student-\(t\) extension.


5. Sub-phase 8.3.4 – Custom Families and lognormal_loc_scale

Sub-phase 8.3.4 introduced the (D-A3.B) custom-family descriptor pattern: the public function gdpar_family_custom_K(stan_lpdf_id, links, supports, min_K, ...) constructs a gdpar_family object from a descriptor whose Stan-side log-density is identified by stan_lpdf_id and whose R-side metadata mirrors the built-in registry. The descriptor pattern subsumes the previous gdpar_family_custom() (single slot) by reading \(K\) from the user-supplied min_K and dispatching the per-slot links via the same mechanism as built-in families.

Three concrete consequences:

The custom-family descriptor pattern is reused in Sub-phase 8.3.5a and 8.3.5b without further structural changes.


6. Sub-phase 8.3.5a – Student-\(t\) (\(K = 3\), stan_id = 8)

The Student-\(t\) family (\(K = 3\)) was added in Sub-phase 8.3.5a with slots (mu, sigma, nu) under links (identity, log, log). The lpdf is the standard location-scale Student-\(t\) density (student_t_lpdf in Stan) with the slot-\(3\) nu interpreted as the degrees-of-freedom parameter.

The sub-phase emerged the did_override mechanism described in §4: the (D-ID layer 1) default for nu (positive real, log link) was correct for the family, but the registry needed a per-family table of minimum \(K\) values (min_K = 3 for Student-\(t\)) to gate the public API. The helper .gdpar_guard_K_below_family_min was renamed from a session-local name to its current canonical form to make the gate explicit.

The release-gate of 8.3.5a (Session 16 of Block 8.3) was a non-trivial test of the per-slot architecture under \(K > 2\): the codegen had to expand THETA_REF_PRIOR_BLOCK over three slots instead of two, and the residual diagnostics (introduced later in Sub-phase 8.3.9) had to compose with a three-slot inverse-link dispatch. The test passed (suite delta +86 PASS / 0 FAIL / +1 SKIP for the Stan-gated smoke); the registry entry for stan_id = 8 is canonical from that session forward.


7. Sub-phase 8.3.5b – Tweedie (\(K = 3\), stan_id = 9)

The Tweedie family (\(K = 3\)) was added in Sub-phase 8.3.5b with slots (mu, phi, p) under links (log, log, identity-bounded-on-(1.01, 1.99)). The bounded-identity link on slot 3 is necessary because the Tweedie exponent \(p\) has a known degenerate behaviour at \(p = 1\) (Poisson limit) and \(p = 2\) (Gamma limit); the bounded interval excludes both degeneracies while preserving the continuous compound-Poisson regime.

7.1. Hybrid lpdf: Dunn-Smyth series + saddlepoint

The Tweedie density for \(1 < p < 2\) has no closed-form expression. The framework’s Stan-side implementation uses a hybrid of two complementary approximations:

The cut-over between the two approximations is implicit (Decision D5 of 8.3.5b): the function selects the series at moderate \(y / \mu\) and falls back to the saddlepoint otherwise, with the threshold derived from the Stan-side numerical tolerance rather than from a user-tunable parameter. The decision rationale is that exposing the threshold would invite mis-specification (users would tune it on a per-fit basis without principled grounds); the implicit hybrid is conservative in both regimes.

7.2. THETA_REF_PRIOR_BLOCK per-family expansion

Decision E7 of Sub-phase 8.3.5b introduced THETA_REF_PRIOR_BLOCK as a per-family placeholder in the Stan template, expanded at codegen time according to the slot’s link and support:

The placeholder mechanism is uniform across all built-in families: each family’s param_specs[[k]]$theta_ref_prior_block field carries the slot-specific prior expansion as a literal Stan code chunk, and the codegen splices it into the model block at compile time. The mechanism is reused unchanged in Sub-phases 8.3.6 and 8.3.7.

7.3. Initial-value helper

The release-gate of 8.3.5b also introduced a per-family initial-value helper for the Stan optimizer / sampler. Tweedie’s slot 3 requires an initial value strictly inside the bounded interval (a naive zero-initialization fails because \(p = 0 \notin (1.01, 1.99)\)). The helper gdpar:::.tweedie_init_p returns a stratified initial value (default: the midpoint \(1.5\) jittered by \(\mathrm{Uniform}(-0.1, 0.1)\) per chain). The mechanism is exposed via the init argument of gdpar() for any family that needs it; users who want to control initialization explicitly can pass a list of per-chain initial values.


8. Sub-phase 8.3.6 – Mixtures and Hurdle Models

Sub-phase 8.3.6 added four mixture / hurdle families:

Family \(K\) stan_id Slot 1 Slot 2 Slot 3
ZIP 2 10 mu (log) pi (logit)
ZINB 3 11 mu (log) phi (log) pi (logit)
Hurdle-Poisson 2 12 mu (log) pi (logit)
Hurdle-NB 3 13 mu (log) phi (log) pi (logit)

8.1. Algebraic decompositions

The four families’ log-densities decompose as follows. Let \(\mu_i = \exp(\eta_{i,1})\) denote the count-process mean, \(\phi_i = \exp(\eta_{i,2})\) (for NB-based families) the dispersion, and \(\pi_i\) the slot-\(K\) inflation / hurdle probability on the unit-interval scale.

8.2. Structural decisions

8.3. Deferred cases

The Hurdle-continuous families (Hurdle-Gamma, Hurdle-Lognormal) and the \(K < K_{\min}\) degenerate case (e.g., a user supplying K = 1 for ZIP, in which case the inflation slot is absent) were deferred to a future sub-phase as out-of-scope for 8.3.6. The guard .gdpar_guard_K_below_family_min rejects \(K < K_{\min}\) configurations at the public API level.


9. Sub-phase 8.3.7 – Heterogeneous Families per Slot

Sub-phase 8.3.7 introduced heterogeneous families per slot: a single fit in which slot 1 uses one family and slot 2 uses another (e.g., Beta in slot 1 + Gamma in slot 2, both \(K = 2\)). The public API takes a named list in the family argument: gdpar(y ~ x, family = list(slot1 = gdpar_family("beta", K = 2), slot2 = gdpar_family("gamma", K = 2))). The flat-family API (family = gdpar_family("gaussian", K = 2)) is preserved as a corollary.

The architectural alpha-decision (L1, refined in Sub-phase 8.3.7) is that heterogeneity is per slot, not per coordinate: under multivariate \(\theta_{\mathrm{ref}} \in \mathbb{R}^p\) (Sub-phase 8.6.A), the slot-\(k\) family applies uniformly across the \(p\) coordinates of slot \(k\). The per-coordinate heterogeneity (different families across the \(p\) axis within a slot) was considered and rejected on identifiability grounds: the per-coordinate decomposition \(\theta_{\mathrm{ref}, k} \in \mathbb{R}^p\) requires a coherent prior structure across coordinates, and mixing families across coordinates within a slot fragments that coherence.

The implementation introduces two Stan-side conveniences:

The release-gate guard rejects \(K \geq 3\) heterogeneous configurations (e.g., heterogeneous over three slots) as out-of-scope for 8.3.7. Five \(K = 2\) branches were refactored to the named-list API: stan_id 1 (Gaussian), 3 (NB), 5 (Beta), 6 (Gamma), 7 (custom-via-lognormal-loc-scale).

The bit-exactness preservation at the release-gate is structurally non-trivial: the goldens for \(K = 2\) Beta + Gamma (from Sub-phase 8.3.4) had to be preserved bit-exact under the refactor (no re-bootstrap). The audit-compare path (gdpar_compare_eb_fb) registered zero FAIL on the bit-exact compare for the refactored families.


10. Sub-phase 8.3.8 – B-spline W Basis (D-D3)

Sub-phase 8.3.8 introduced the B-spline W basis as a canonical alternative to the polynomial W basis previously used in the AMM linear predictor. Six decisions canonized:

A side-effect of the refactor: the Stan-side W_is_polynomial boolean data field was eliminated and replaced by the W_type_id integer. The elimination is canonical and the field does not return.

10.1. Cox-de Boor recurrence (D2 detailed)

Given a non-decreasing knot vector \(\boldsymbol{\tau} = (\tau_0 \leq \tau_1 \leq \dots \leq \tau_{m})\) and degree \(d \geq 0\), the B-spline basis functions \(B_{j, d}(x)\) for \(j = 0, \dots, m - d - 1\) are defined by the Cox-de Boor recurrence:

\[B_{j, 0}(x) \;=\; \begin{cases} 1, & \tau_j \leq x < \tau_{j+1}, \\ 0, & \text{otherwise}, \end{cases}\]

\[B_{j, d}(x) \;=\; \frac{x - \tau_j}{\tau_{j+d} - \tau_j} B_{j, d-1}(x) \;+\; \frac{\tau_{j+d+1} - x}{\tau_{j+d+1} - \tau_{j+1}} B_{j+1, d-1}(x),\]

with the convention \(0/0 = 0\) for the boundary fractions when consecutive knots coincide. For the default cubic case (\(d = 3\)), the recurrence evaluates 4 basis function values at each \(x\) (the non-zero ones overlapping the active knot interval), independent of \(m\).

The Stan-side implementation in inst/stan/functions/W_basis.stan evaluates the recurrence in a single forward pass over \(d\) levels, with a local array of length \(d + 1\) holding the partial values. The numerical cost per evaluation is \(O(d^2)\), which is \(O(1)\) at the default cubic. The R-side W_basis() constructor returns the basis evaluation matrix (for sampling-free contexts like coefficient interpretation) using the equivalent splines::splineDesign call from base R; the two evaluations agree to machine precision (verified by the regression test test-bspline_W.R).

10.2. Boundary knot semantics

The boundary_knots argument of W_basis(x, type, degree, knots, boundary_knots) specifies the two outermost knots of the knot vector. The interior knots are passed via knots. The full knot vector is then constructed as

\[\boldsymbol{\tau} \;=\; \bigl(\underbrace{\tau_{\mathrm{lo}}, \dots, \tau_{\mathrm{lo}}}_{d + 1}, \mathtt{knots}, \underbrace{\tau_{\mathrm{hi}}, \dots, \tau_{\mathrm{hi}}}_{d + 1}\bigr),\]

with the boundary knots repeated \(d + 1\) times to enforce zero-derivative-of-order \(d\) at the boundaries (the “clamped” B-spline convention). This convention ensures that the basis evaluation at the boundary is well-defined and equal to one for the boundary basis function (a useful property for interpretation: the boundary coefficient is the response at the boundary).

The R-side W_basis() constructor rejects configurations where the boundary knots are not strictly outside the range of knots (D4 strict validation), preventing the degenerate case where the boundary repetition overlaps the interior knots.


11. Sub-phase 8.3.9 – Residuals G1 / G2 / G3 + S3 Methods Re-validation + Route B predict.gdpar_fit for \(K > 1\)

Sub-phase 8.3.9 introduced the three residual diagnostics that compose under \(K \geq 1\). Each diagnostic is defined per slot and is unit-coherent with the slot’s response scale.

11.1. (G1) Pearson-type residual per slot

For slot \(k\) and observation \(i\), denote by \(\mu_{i,k}(\theta_i)\) and \(s_{i,k}(\theta_i)\) the slot-implied response mean and standard deviation (both functions of the full \(\theta_i = (\theta_{i,1}, \dots, \theta_{i,K})\) in the general case, because slot statistics may depend on cross-slot quantities — e.g., for ZINB the slot-1 implied mean is the unconditional mean \(\mu_i (1 - \pi_i)\) rather than just \(\mu_i\)). The Pearson-type residual is \[r_{i,k}^{(G1)} \;=\; \frac{y_i - \mu_{i,k}(\theta_i)}{s_{i,k}(\theta_i)}.\] For \(K = 1\) Gaussian this reduces to the standard Pearson residual. For mixture / hurdle slots the residual uses the unconditional moments of the slot’s marginal contribution.

The (G1) residual is fast to compute (no auxiliary sampling) and is the canonical first-pass diagnostic. Its limitation is that it is symmetric in the location-scale family and does not detect distributional mis-specification beyond the second moment.

11.2. (G2) Randomized quantile residual (Dunn-Smyth) per slot

For slot \(k\) and observation \(i\), the (G2) residual is \[r_{i,k}^{(G2)} \;=\; \Phi^{-1}\bigl(F_{i,k}(y_i^*)\bigr),\] where \(F_{i,k}\) is the slot-conditional CDF and \(y_i^*\) is the realized response, possibly jittered for discrete cases following Dunn & Smyth (1996). For continuous slots, \(y_i^* = y_i\) and \(F_{i,k}(y_i)\) is uniform on \([0, 1]\) under correct specification, so \(r_{i,k}^{(G2)}\) is standard normal under the null. For discrete slots (Poisson, NB), \(F_{i,k}\) is jittered as \(u_i F_{i,k}(y_i) + (1 - u_i) F_{i,k}(y_i - 1)\) with \(u_i \sim \mathrm{Uniform}(0, 1)\), restoring the continuous-uniform property under the null.

For mixture / hurdle slots, the jitter respects the zero-component and the count-component separately: the zero-component is treated as the lump-mass at 0 (the jitter range is \([0, F_{i,k}(0)] = [0, \pi_i]\) for ZIP / Hurdle), and the positive-count component is jittered as in the count-only case.

The (G2) residual detects distributional mis-specification beyond the second moment (skewness, kurtosis, tail behaviour). Its computational cost is moderate; it requires evaluating the slot-conditional CDF at every observation, which is closed-form for the built-in families but may require numerical integration for custom families.

11.3. (G3) DHARMa-compatible scaled residual per slot

For slot \(k\) and observation \(i\), the (G3) residual is the rank of the realized response among \(M\) posterior predictive draws, scaled to \([0, 1]\): \[r_{i,k}^{(G3)} \;=\; \frac{1}{M} \sum_{m=1}^{M} \mathbf{1}\bigl\{y_{i,k}^{(m)} \leq y_i\bigr\} \;+\; \frac{u_i}{M}, \qquad u_i \sim \mathrm{Uniform}(0, 1),\] where \(y_{i,k}^{(m)}\) is the \(m\)-th posterior predictive draw for observation \(i\) in slot \(k\) and \(u_i\) is a continuity-correction jitter. The diagnostic is compatible with the DHARMa R package’s simulationOutput interface and is opt-in through the dharma = TRUE argument of gdpar_residuals().

The (G3) residual is the most expensive of the three (it requires \(M\) posterior predictive draws per observation) but is the most general: it works for any family with a valid posterior predictive distribution, including custom families and complex mixture / hurdle compositions where the slot-conditional CDF (needed by G2) is unavailable in closed form.

11.4. S3 method re-validation under \(K > 1\)

The S3 methods coef.gdpar_fit, print.gdpar_fit, summary.gdpar_fit, predict.gdpar_fit, and gdpar_residuals were re-validated under \(K > 1\) in Sub-phase 8.3.9. Each method had been written under the assumption of \(K = 1\) and required extension to the per-slot architecture.

The release-gate decision is that the methods return named lists per slot under \(K > 1\) (preserving access to per-slot diagnostics) and flat vectors under \(K = 1\) (preserving backward compatibility with the Block 1 default). The dispatch is via a is_K_gt_one(fit) helper at the top of each method; the per-slot iteration is then uniform across families.

The Route B predict.gdpar_fit for \(K > 1\) is the most non-trivial of the S3 re-validations: the predicted response under \(K > 1\) is an array of dimension \(S \times n \times K\) (posterior draws \(\times\) observations \(\times\) slots), and the per-slot inverse-link must be applied dimension-wise. The implementation in R/methods.R::predict.gdpar_fit dispatches to predict_from_newdata_K (the \(K > 1\) helper) when K > 1 and to predict_from_newdata (the \(K = 1\) helper) otherwise. The slot-wise inverse-link dispatch uses apply_inv_link_by_id (see §9) on the R side, mirroring the Stan-side implementation.

11.5. Bootstrapped goldens and the 16-column manifest

The release-gate of 8.3.9 introduced 14 bootstrapped goldens with a 16-column manifest CSV recording the goldens’ metadata: stan_id, \(K\), family name, seed, bootstrap iterations, posterior draws, observations, slot link IDs, golden RDS path, golden hash, generation timestamp, framework version, R version, Stan version, gdpar git commit, and per-golden notes.

The goldens are stored as compressed RDS files under tests/testthat/_snaps/ and verified bit-exact in the regression tests test-golden_regression_K2.R and test-golden_regression_8_3_9.R. The bit-exactness check is at the per-slot coefficient level (machine precision); the test fails if any coefficient diverges by more than \(10^{-12}\) relative to the golden, which catches both implementation drift and Stan-version-induced numerical changes.

The 14 goldens cover the 7 mixture / hurdle and heterogeneous configurations plus 7 distributional / B-spline configurations selected to exercise the codegen paths that emerged in 8.3.4 to 8.3.8. The 16-column manifest is read by the regression tests via manifest <- read.csv(system.file("extdata", "golden_manifest_8_3_9.csv", package = "gdpar")) to dispatch each test case to its corresponding RDS file.


12. Sub-phase 8.3.10 – Release-Gate for Session 8.3

Sub-phase 8.3.10 is the release-gate that closes Session 8.3 as a coherent extension cycle. Six decisions canonized:

12.1. Fuzz testing protocol

The release-gate fuzz exercises the S3 methods (coef, predict, summary, print, gdpar_residuals) under randomized configurations to catch silent regressions that fixed-configuration smokes might miss. The protocol is:

  1. Configuration sampler. For each fuzz run, sample \((K, \texttt{stan\_id}, \texttt{family\_args}, \texttt{group\_size}, \texttt{path})\) from the admissible product space: \(K \in \{1, 2, 3\}\), \(\texttt{stan\_id} \in \{1, \dots, 13\}\) subject to \(K \geq K_{\min}(\texttt{stan\_id})\), family_args drawn from a per-family valid range, group_size \(\in \{1, 5, 25\}\), path \(\in \{\)Path A, Path B\(\}\). Sampling rejects degenerate configurations (e.g., \(K = 1\) for ZIP).
  2. Synthetic data generator. For the sampled configuration, generate \(n = 200\) observations from the corresponding distribution under known true parameters. The true parameters are stored as ground truth for the post-fit comparison.
  3. Fit and call all S3 methods. Run gdpar() with the sampled configuration; call coef(fit), predict(fit), summary(fit), print(fit), gdpar_residuals(fit). Each call must return an object of the expected class, satisfy the K-dispatch contract (named list per slot for \(K > 1\); flat for \(K = 1\)), and pass schema-validation expectations.
  4. Tier 1 bit-exact compare. For 36 of the 108 fits, re-fit under identical seed and assert bit-exact equality of the coefficient table, the predicted means, and the residuals (machine precision: \(10^{-12}\) relative tolerance).
  5. Tier 2 semantic compare. For 6 of the 108 fits, fit twice under different paths (Path A and Path B) and assert that the posterior summary statistics agree within statistical sampling tolerance (Monte Carlo standard error \(\times 3\)).

The fuzz protocol is implemented in tests/testthat/test-fuzz_s3.R, gated by the environment variable GDPAR_RUN_STAN_S3_FUZZ=1 because each fuzz fit takes 10-60 seconds and the full sweep is several CPU-hours. The release-gate ran the full fuzz once at closure; subsequent CI runs sample a subset.

12.2. Debts recorded at release-gate

The release-gate of Sub-phase 8.3.10 recorded the following debts for Sub-phase 8.4 (the audit phase):


13. Synthesis: The Per-Slot Architecture as a Coherent Design

Read sequentially, Sub-phases 8.3.1 to 8.3.10 implement a single architectural decision applied consistently: the per-slot resolution layer is the single source of truth for everything that depends on the slot index \(k\). Five corollaries follow:

The architecture’s structural cost is the up-front investment in param_specs and the integer-dispatch helpers (§5, §9, §10). The structural benefit is that the cost is paid once and amortized across all families and all future extensions.


14. Implementation Status (Release-Gate Context)

The present vignette canonizes decisions implemented in development version 0.0.0.9001 and verified at the release-gate of Sub-phase 8.3.10. Concretely:

The following items are deferred at the time of this vignette (Block 8.4 Stage 2 audit closure):

The release version bump from 0.0.0.9001 to a stable 0.1.0 or similar is scheduled for post-Block-9 closure.


15. References (selective)


End of v08d.