Repository navigation
Declare reporting-only functions and flag near-miss parameter names - #604
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
The nested query model and query data modules keep their certified declaration surfaces after losing their only adaptive helper bodies, and the control counts follow the deleted adaptive entries. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
Brings in the pin simulation-reader fix and main through 582. Reconcile the certificate once for the integration: - repin the 84 drifted corridor pins over 28 sources, all files this branch changes against main; - repin the backward publication corridor after the adaptive carry plumbing left it; - reseal sources, which drops the deleted adaptive modules. Anchor the counter-reservation mutation on the feasibility reservation, because the continuation reservation repeats its size line. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
# Conflicts: # tests/candidate_certificate/direct_flow.py # tests/candidate_certificate/sources.json
The final nested, additional helper and scalar-query control populations already had the sizes their specification builders construct (104, 48 and 62); the aggregate runner still compared them against the older counts and name digests. Record the current counts and digests, and update the test literals that repeat them. Two nested controls fired but were scored as admitted because their exact expected error sets left out co-owners that legitimately refuse the same edit. An overload edit of the nested query reader changes that module's surface, so it now expects every surface co-owner, including the additional helper family. A surface edit of the feasibility module also trips the native feasibility summary's module-surface pin, which is now expected. Drop the shared-mesh sharding control: the branch it altered, which kept the adaptive outer mesh unsharded, was deleted with the adaptive query route, so the mutation no longer changed anything. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
The supplemental population on this branch is 96 controls: the 54 shared with main plus 42 scalar-query status, query and borrowing-bound controls. The grouped mapper, grouped guard, action grid, uniform and normal process tests still asserted main's 54, so they now pin the branch count and name digest, and the normal test's historical total follows. The corridor holds 171 sources: main's 118 plus 53 nested, scalar-query and state-dependent borrowing sources, which the normal test now names. The original 117-source roster digest is still asserted over the sources that remain after removing them. The coverage checks in the action grid and uniform tests include the families that own those 53 sources, so every certified source is still required to carry a control. Four reviewed-prefix specimens in the test named helpers whose bodies moved into `DCEGMQuery._read_at_floor_with_summary`, `_blend_owned_rows` and `_read_owned_row_with_support`; they now name those helpers, matching the verifier. The child-slot activity specimen anchors the status reduction call, because `_read_one_row_dc_child` now passes `active` twice, and the body-change check selects the runtime implementation of an overloaded helper rather than its stubs. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
…r search Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
AgeSpecializedGrid.signature is now optional. Without it, the dedup key is the built grid's class, node dtype and node bytes, so ages share one compiled program exactly when build(age) returns equal grids. An explicit signature still replaces the key. AgeSpecializedFunction still requires one. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
Constraint routing compared a declared constraint's unqualified argument names against the qualified param names a site lists, so a DC-EGM or NEGM constraint reading a regime param was refused although the site binds it. The router now treats a param's last path segment as bound wherever its qualified name is. Test fixtures: - the outer-search comparison accepts the optional result fields that stay absent in ordinary searches; - the clean-status helper expects the parent's own query slot and bound summaries only when the parent installs a query authority; - the two-regime terminal model declares a regime id with exactly its regimes. Repin ds_app2_housing: removing the adaptive_outer field from EGMQuerySpec is the whole change; omitting that field from the fingerprint at the parent commit reproduces both new pins. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
off_grid at its default is omitted from the fingerprint, which restores the identity from before off_grid existed; the inline pin was set while the default was still hashed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
When read counting is on, a child read without an installed query now returns its ContinuationReadCounts too. The producer decides support: a solver whose rows lie on the child's state grid supports every carried node, so its -inf values are economic and its reads count; an endogenous-grid producer supports only finite-valued nodes, so a dead placeholder row counts nothing. The tag is the producer's declared EGMContinuationLayout.rows_share_state_grid, carried on the child read. The stochastic-node fold now carries a count slot for every counted read. Equal endogenous cash keeps the non-strict order: the rightmost tuple (the highest saving) owns the exact read and opens the next interval. The comment states that rule, and the equal-cash test now checks it against a hand-derived log-utility reference. The finite NN-B-EGM checked-program test expected zero terminal read counts; under the producer rule its terminal reads count, 3 illiquid nodes x 6 savings nodes x 4 keeper/adjuster candidates, none below the first liquid node. Certificate: repinned the six continuation.py corridor pins with repin_corridors.py --changed-source for continuation.py and one_asset_egm_step.py, then check_seals.py --fix; verify.py passes. The four unconditional collect_continuation_read_counts=True sites (dcegm.py:600, egm.py:752, nbegm.py:1090, nbegm.py:7053) each build only a checked variant: _CheckedCoreVariant at dcegm.py:671/692, egm.py:1133 (fed by egm.py:752 and, through nbegm.py:1126, nbegm.py:1090) and nbegm.py:7091. select_programs swaps a checked variant in only when its collect_continuation_read_counts is true (core_program.py:772), and the solve passes validation_enabled(logger) (backward_induction.py:536,570), which is logger.runtime_checks for a run logger and True for any other logger (utils/logging.py:147). So in a solve they run only under runtime checks; a direct select_programs(collect_continuation_read_counts=True) call, as tests make, also reaches them. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
…params The build-time floor trace gave every non-continuous state an int32 leaf, so a callable floor whose helper reads a stochastic process state (IID or AR(1)) received integer codes and a typed helper rejected them. Processes have discrete topology but are read at their float node values, so they now trace in the canonical float dtype. The discount-factor reader unpacked the Koopmans aggregator's only extra argument. CESAggregator also takes the intertemporal elasticity, so the finite nested corner read under a callable floor failed. The reader now selects the argument whose last name segment is discount_factor; every query reader (scalar, DC, NB, finite NB/NEGM) and the EGM step route through it. Tests: a GridSearch floor over IID and Rouwenhorst nodes matches a hand-computed terminal value; a CES NN-B-EGM model with a callable floor equal to the literal one matches the literal solve over two alive periods; the reader returns beta from a CES aggregator. Certificate: repinned validate_declared_bounds, _DiscountFactorReader.__call__ and the preferences.py surface with repin_corridors.py, then check_seals.py --fix; verify.py passes. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
…ue grids A `DiscreteGrid(values=...)` variable was refused wherever a regime transition law, a collective regime, a joint transition or a carried-state imputation read it. These declarations now go through the value adapter like every other user function: - regime transition laws and gates read values; they still return regime codes or probabilities; - a household's stakeholder utilities, Pareto weights and value-dependent constraints read values, and the declaration holds the adapted bodies the engine runs; - a projection, a joint output and an imputation of a value-grid state return a value, which becomes the code of its node; - an adapted `functools.partial` publishes only the arguments it leaves free, so its fixed keywords are no longer requested as parameters. Condition constraints and age-specialized markers keep their refusal: neither is a function the adapter can wrap. A float value grid now holds its nodes at the precision in force when they are read, and the model reads them when it is built, so a grid built before x64 is enabled holds float64 values in a float64 model. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
…lity # Conflicts: # tests/candidate_certificate/direct_flow.py # tests/candidate_certificate/sources.json
…quiet The fixture module now follows the `tests/egm/_*` helper convention that the test-naming hook excludes, and the certificate specimen's string split no longer leaves a bare "ons" fragment; the joined expression is unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
`outer_refinement.py` also carries `_fold_exact_outer_nodes`, which the additional-helper family selects, so the store entry for that source is a superset of the outer-helper contract. The test now checks the family's surface and each of its callable digests against the store; unselected pins are still refused by `_unselected_pins`. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
The final-nested and additional-helper populations lost 18 and 6 controls with the deleted corridor sources, so the omitted-control aggregate counts are 103 and 47. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
`read_finite_outer_choices` traced its native-row reader, corner reader and validation once per outer candidate in a Python loop, so the period program grew linearly in `outer_capacity`. On the DS-2024 housing test model (n_grid=6) the period-0 outer-sweep program had 419,313 StableHLO ops against 35,505 on main, and XLA spent minutes and ~20 GB compiling it. The candidates differ only in their index and identity, so the loop body is now one function vmapped over the candidate axis. The same program lowers to 106,441 ops; the `[negm]` build-and-solve test drops from 20.7 GB / 390 s to 5.9 GB / 48 s at fp64. Batched corner arithmetic rounds differently from the per-candidate program in a few ulps, which the period-0 solve amplifies at isolated cells (largest observed value change 0.023 on a 5-point instance). Results are therefore equal to rounding, not bitwise, to the unrolled program. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
The certified corridor gained ten sources whose mutation controls live in the final-nested, child-native and additional-helper families. The runner's own coverage check (`direct_flow_mutation_specs`) already counts those families; the test that mirrors it listed only the families that existed before, so it reported the ten sources as uncovered. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
The manifest gains `linux_only_files`: general-universe files with no reasonably expected OS-dependent behaviour (numerics, certificates, kernels). The macOS and Windows general legs shard the universe without them; the Linux legs still run every general file. `tests.ci.ci_workloads.general_leg_universe` is the one place that narrows a leg, the runtime sharder and the generator both go through it, and the generator now also recomputes each general shard's predicted payload. Contract tests pin that a Linux-only file still runs on every Linux leg and on no macOS or Windows general shard. The list holds 676 files: 558 of main's general universe as classified for OS dependence, and 118 of the 124 files this branch adds. Kept on every OS: files touching paths, file I/O and persistence, process spawning, locale or float formatting, or platform dependencies, numeric files that also hold a save/load/pickle/capture test, and every file whose classification was uncertain. With the reduced load the macOS and Windows legs take one shard each (predicted 6.55 and 7.84 payload minutes), down from four. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
`SimulationResult.to_dataframe`, `SolutionResult.value_array` and `SolutionResult.value_frame` take `use_categorical_codes` instead of `use_labels`, with the opposite meaning: the default `False` keeps categorical columns and coordinates, `True` gives integer codes. `SimulationResult.save` takes `df_use_categorical_codes`. The old name has no alias. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
Twelve campaign tests call `run_direct_flow_mutation_controls`, which verifies
the whole certified corridor once per mutation (1265 verifications), and the
job then ran the standalone `--self-test`, one more full pass. One serial pass
took 51 minutes locally, so two tests hit the 30-minute per-test timeout and
the job was cancelled at 60 minutes with three suites never started.
- `tests/candidate_certificate/runner_replay.py` keys every verdict by what the
verifier reads -- the corridor source bytes and the source seals -- records
the trees one runner call verifies, verifies them across a four-process pool,
and answers later calls from those verdicts. The runner's aggregation, which
is what the fault-injection tests probe, still runs for real on every call.
- The twelve tests share a session fixture and `xdist_group("direct_flow_runner")`;
the lane runs `--dist loadgroup` so they share one worker.
- The standalone verifier and its self-test move to their own job,
`tests-source-certificate-standalone`, gated by `cpu`.
Locally the campaign now passes in 25.5 minutes at two workers under coverage,
with a process-tree peak of 3.1 GB.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
`tests/solution/` is marked `slow` wholesale, which the macOS and Windows general legs deselect, so its tests of on-disk state never ran on those platforms. The manifest now lists them as `os_persistence_tests` (`<file>::<test function>`: 214 functions in 42 files whose bodies use save/load_solution, pickle/cloudpickle, h5py, npz, log_path or tmp_path), `tests/conftest.py` marks the listed tests `os_persistence`, and a new `tests-os-persistence` job runs `-m "os_persistence and not manual"` on macOS and Windows at two workers, gated by `cpu`. The rest of each file stays on the Linux solution shards. The selection collects 384 cases. No macOS or Windows timing exists; on the Linux fp64 solution shards of run 39196899855 the selected cases take 2159 JUnit seconds, so each new invocation records a predicted payload of 17.99 minutes (largest file 593 s) as a Linux-measured estimate. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
The weighted split sorts a file with no leg weight as zero cost, so every file a leg had never measured landed on one shard: 219 files on fp64-linux shard 2/3 and fp32-linux shard 1/3, which ran 59 and 41 minutes on c359260 while their siblings took 16-29. `tests/ci/generate_ci_workloads.py --refresh-leg <leg> --junit <glob> --junit-source <text>` now replaces one leg's `leg_weights` with the summed JUnit testcase seconds and testcase counts of that leg's reports from one run, records the given provenance, and re-derives the shards. `frozen_head`, the root `file_weights` and every other leg are left alone. A classname that names no test file is refused. Both Linux legs are refreshed from run 39196899855 attempt 1 at c359260, whose three fp64-linux and three fp32-linux general shards all completed: 656 files weighted per leg, 83 universe files with no testcase under the general selection stay unweighted. Predicted payloads move from 16.0/13.49/13.49 to 29.97/29.97/29.97 minutes (fp64) and from 15.58 x3 to 29.88/23.9/23.9 (fp32), under the 30-minute guardrail. macOS, Windows and the solution legs keep their weights. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
A `DiscreteGrid(values=...)` variable is a code inside the engine; every place a caller hands pylcm its nodes or reads them back now uses the values: - `to_dataframe` gives an ordered numeric Categorical whose categories are all of the grid's values; - initial conditions, as a mapping or a frame, take the values as numbers or as such a Categorical, whose categories must be exactly the grid's values in order; integers match exactly, floats within the grid's tolerance, and anything else raises naming the value; - a `pd.Series` level in params takes the values as labels and refuses string spellings; - `lookup_policy` reads states and action grids in values and returns a value-grid action as an array of its values; - `value_array` and `value_frame` carry the values as coordinates. `use_categorical_codes=True` on `solve`, `simulate`, `validate_transitions`, `validate_initial_conditions`, `initial_conditions_feasibility` and `lookup_policy` switches all of these to integer codes. `shock_paths` keeps category codes, so a path replays exactly; its docstring and `value_array`'s say so and show how to map codes to values. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
The grids page gains a section on discrete grids with numeric values: how to declare them, that functions receive values and integer values arrive as int32, how values are matched, and that every boundary uses values by default and codes with `use_categorical_codes=True`. It states the one exception, `shock_paths`, which holds codes so a path replays exactly and losslessly, and shows how to map codes and values with `grid.values`, `grid.encode` and `grid.decode`. The pages on simulating, pandas interop and results point to it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
hmgaudecker
added a commit
that referenced
this pull request
Oct 24, 2026
Integrate codex/600-explicit-functions at 7e8d108. Keep the upstream witness adjustments unchanged; production source and certificate controls are unchanged relative to the preceding base integration. Upstream CI remains in progress. No local upstream test repair is included.
…ixed batches - The runtime guard's docstring states the scheduler's policy: dependency order, and the earliest-declared waiting regime when none is ready. - test_a_self_route_decides_again_at_its_clipped_projected_state: the projection lands beyond the grid, and only the clipped state has an action. - test_a_forward_reroute_inside_a_cycle_acts_in_a_fallback_that_has_not_run: `a` and `b` fall back to each other; an empty landing in `b`, which runs first, acts in `a`. - test_a_mixed_batch_reaches_each_fallback_at_its_own_clipped_state and test_a_mixed_batch_counts_each_off_grid_landing_once_at_its_own_fallback: one decision in `x` sends rows to two fallbacks with different grids, beside rows that stay. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
…/iid-continuation-reads Conflict in tests/candidate_certificate/sources.json resolved by resealing the merged tree with check_seals.py --fix; only byte seals had drifted. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
…ealised-shock Conflict in tests/candidate_certificate/sources.json resolved by resealing the merged tree with check_seals.py --fix; only byte seals had drifted. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
…eads-carried-target-state Conflict in tests/candidate_certificate/sources.json resolved by resealing the merged tree with check_seals.py --fix; only byte seals had drifted. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
…state-declaration-in-handoff-error Conflict in tests/candidate_certificate/sources.json resolved by resealing the merged tree with check_seals.py --fix; only byte seals had drifted. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
…590-period-target-values Conflict in tests/candidate_certificate/sources.json resolved by resealing the merged tree with check_seals.py --fix; only byte seals had drifted. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
…functions Conflict in tests/candidate_certificate/sources.json resolved by resealing the merged tree with check_seals.py --fix; only byte seals had drifted. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LAZ63AjbZFLweWuJyPUs6S
hmgaudecker
added a commit
that referenced
this pull request
Oct 24, 2026
hmgaudecker
added a commit
that referenced
this pull request
Oct 25, 2026
`_build_zero_V_arr` lost its last source caller when the solve moved to abstract templates; the distributed HLO test now builds its zeros from `_build_V_arr_template`, and the value-topology corridor pins that instead. `_captured_next_values` is only reached from a capturing solve, which always passes the templates, so its empty-templates branch could not run. Certificate re-anchored with repin_corridors.py and check_seals.py --fix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
timmens
approved these changes
Oct 25, 2026
timmens
left a comment
Member
There was a problem hiding this comment.
Approved conditional on resolving the pre-commit.ci mergeability-check error before merging and confirming that the check passes.
The interface and architecture look good. On head 465cf78, 46 focused local tests passed, covering reporting declarations, required parameters, near-miss hints, persistence, and fingerprints. The documentation build also passes.
hmgaudecker
added a commit
that referenced
this pull request
Oct 25, 2026
This was referenced Oct 25, 2026
Removing the value placeholders removed the slack that had covered two allocations no admission reserved. An invariant-blocked value assembled from two or more blocks holds its complete destination while later block programs run. `_internal_reservations_by_cell` now charges that destination once per cell, on every device's shard, across codes and width candidates; a one-code value is returned directly and needs none. A capture records every regime's next-period value, but the solve holds only the computed ones. The others are no longer padded with device zeros: the public archive writes host zeros and describes their layout from the templates, and the replay payload carries each regime's shape and dtype. Replay keeps every regime it holds no value for as a template in its recorded position; public replay uploads only the values the period's programs read, and `_run_period_kernel` dispatches without the templates. Both capture formats are unchanged and older captures still load. Certificate re-anchored with repin_corridors.py and check_seals.py --fix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each blocked candidate of a budgeted solve is admitted with its cell's destination: dropping the cell's internal reservation lowers its resident bytes by at least the solved value's size. A two-period model whose 32-code values dwarf every other buffer is refused at a budget that covers the working period without its destination but not with it; the destination's size comes from the solved array, not from the accounting under test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #600.
Stacked on #603 (
feat/590-period-target-values, integrated through71da12399cdf2ad817504781dd8d9f3e86375ddc).Unresolved function arguments remain implicit runtime parameters.
get_params_template()adds near-miss hints for names resembling a state, action or function in the same regime. Hints decorate a fresh returned copy, preserve the internal template and parameter diagnostics, and survive variable pruning and pickling.Unread user registrations fail at model build with their regime and names. Declare reporting targets through
Model(..., output_only_functions=(...))orRegime(..., output_only_functions=(...)), without declaring a name at both levels. Reporting functions retain their required runtime parameters; simulationadditional_targetscontinues to select consumed or explicitly retained functions.Read analysis covers declared phases, dormant edge laws, target-owned gates and projections, solver roles, pruned states and phase-restricted factories. Lowerer-owned reconstruction functions carry their per-regime ownership into unread validation. Empty reporting declarations preserve existing durable model identities, while populated declarations remain fingerprinted.
Shared test builders register helpers where their actual consumers exist, and reporting fixtures declare their targets. The benchmark pin retains the registration-compatibility commit included in aca-model #24. The separate lcm-zoo migration remains outside this pylcm PR.
Validation: hosted CPU tests at float64 and float32, macOS/Windows coverage, the bounded GPU policy, GPU benchmark, notebooks, type checks, documentation and pre-commit checks pass on
671129d7ebdf1e1af005a3c658e9e73f6556dac5. The maintained standalone certificate and mutation controls pass; the downloaded receipt matches this commit's complete certified source inventory. Focused repair regressions, ownership/identity controls and the workload check also pass locally.Local runtime verification reused an existing tests-cpu Pixi environment with asserted checkout imports and a matching scratch native build; it was not a fresh installation from the candidate lock. Full numerical, platform and accelerator coverage is being checked by CI. ACA scientific solves and complete external workflow parameter preparation were not run locally. Existing unread user registrations must be removed or declared for reporting.