Skip to content

Declare reporting-only functions and flag near-miss parameter names - #604

Merged
hmgaudecker merged 1050 commits into
mainfrom
codex/600-explicit-functions
Oct 27, 2026
Merged

hmgaudecker merged 1050 commits into
mainfrom
codex/600-explicit-functions

Conversation

@hmgaudecker

@hmgaudecker hmgaudecker commented Oct 22, 2026 •

Copy link
Copy Markdown
Member

Closes #600.

Stacked on #603 (feat/590-period-target-values, integrated through 71da12399cdf2ad817504781dd8d9f3e86375ddc).

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=(...)) or Regime(..., output_only_functions=(...)), without declaring a name at both levels. Reporting functions retain their required runtime parameters; simulation additional_targets continues 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.

hmgaudecker and others added 30 commits October 18, 2026 12:54
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.
hmgaudecker and others added 7 commits October 24, 2026 09:56
…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
mj023 and others added 2 commits October 25, 2026 12:11
`_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 timmens left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

mj023 and others added 4 commits October 26, 2026 14:12
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>
Base automatically changed from feat/590-period-target-values to main October 27, 2026 20:41
@hmgaudecker
hmgaudecker merged commit d455ef0 into main Oct 27, 2026
0 of 2 checks passed
@hmgaudecker
hmgaudecker deleted the codex/600-explicit-functions branch October 27, 2026 20:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make unresolved names and unread functions explicit

3 participants