Skip to content

Every baseline model has been unrunnable since 2026-08-02 — catalog.py reads the retired config['targets'] key (27 models) #84

Closed

Description

@Polichinel

Summary

views_baseline/model/catalog.py reads self.config["targets"] at 7 call sites. That key was
deliberately retired by views-pipeline-core on 2026-08-02 (507ae11, "fix!: retire the
synthesized targets config key", refs #380 / C-269). pipeline-core migrated its own 13 read sites
to a new helper; views-baseline was never swept.

Every baseline model has therefore been unrunnable since 2026-08-02 — that's 27 models in
views-models whose algorithm this catalog serves.

Found from views-hydranet, where it blocks a pre-registered acceptance criterion (details at the
bottom). Filing here rather than fixing it, since this is your repo.

The failure

File "views_baseline/model/catalog.py", line 75, in _get_conflictology_model
    targets=self.config["targets"],
            ~~~~~~~~~~~^^^^^^^^^^^
KeyError: 'targets'

Reproduced 2026-09-07 running light_strider on the validation partition.

Why the key is gone

pipeline-core's ConfigurationManager.get_combined_config used to synthesise
config["targets"] from regression_targets + classification_targets for every model. It was a
backward-compatibility shim. views-evaluation retired targets in its 0.4.0 API and now raises
on a config carrying it — and pipeline-core hands its whole merged config to NativeEvaluator — so
the shim broke every evaluation run.

507ae11 removed the synthesis rather than hiding it, and its message is explicit that this was
the deliberate choice:

An earlier idea was to strip it at the evaluator boundary, which would have kept a dead key alive
everywhere else and concealed it from the one component honest enough to complain.

The 7 sites

views_baseline/model/catalog.py — lines 57, 62, 67, 75, 85, 98, 112, one per builder:

line builder
57 _get_zero_model
62 _get_locf_model
67 _get_average_model
75 _get_conflictology_model
85 _get_mixture_model
98 (mixture variant)
112 _get_parametric_hurdle

The replacement pipeline-core provides

views_pipeline_core.managers.configuration.configuration.combined_targets(config) — verified
importable from the currently pinned pipeline-core. It returns regression targets then
classification targets, and raises if a retired key reappears (the old shim let a stale
targets take precedence, which is how it could quietly outrank the split keys).

So each site is plausibly:

targets=combined_targets(self.config),

We have not tested this — it is what the migration did in pipeline-core, offered as a starting
point, not a verified patch. Two things worth checking that we could not check from outside:

  1. Ordering. combined_targets returns regression-then-classification. If any baseline model
    depends on a different order, concatenation order matters and should be pinned by a test.
  2. Models with no classification targets. light_strider declares only regression_targets;
    the helper returns [] for the missing key where the old shim reportedly crashed on None. Fine
    for us, but worth confirming against the other 26.

Blast radius

27 models in views-models carry an algorithm served by this catalog:

MixtureBaseline 8 · ParametricHurdleConflictology 6 · LocfModel 5
ConflictologyModel 4 · ZeroModel 2 · AverageModel 2

Why we care downstream

light_strider is the datafactory climatology comparator for a pre-registered kill criterion
(K3: "worse than climatology on crps_events/mcr_events for more than half the months") in
views-hydranet's ensemble-roster dossier. Because it cannot run, K3 is recorded VOID, not PASS —
the 8-member roster has never been compared to a baseline. Tracked at views-hydranet#249.

No urgency implied for your planning; we have recorded it as untested rather than assuming a pass.

Suggested check once fixed

A test that constructs each of the 7 builders from a realistic merged config would have caught this
and would catch the next retired key. Right now the first signal is a KeyError in a training run.

Cross-refs: pipeline-core 507ae11 (#380, C-269) · views-models#445 (filed 2026-09-07, same root
cause, no comments yet) · views-hydranet#249.

Activity

  1. Polichinel commented on Sep 9, 2026

    @Polichinel
    ContributorAuthor

    Picked this up — it is now owned by epic #85, with the fix as #86 and seven further stories
    through to the views-models adoption (views-platform/views-models#459).

    Three notes from the investigation, one of which changes the proposed fix.

    1. The count is 29, not 27. The tally here omits the two ParametricConflictology models
    (doctorish_dwarf, stumpy_dwarf). views-platform/views-models#445 has the correct roster.

    2. Divergence on the fix — not using combined_targets(). This issue proposes
    combined_targets(self.config). That was considered and rejected, for two reasons:

    • views_baseline/model/catalog.py sits under model/, which ADR-013 forbids from importing
      views-pipeline-core at module level
      . Calling the helper there breaks the one topology rule this
      package actually maintains (model/ has zero module-level pipeline-core imports today).
    • The alternative — having the manager derive it and pass it down — leaves one of seven config
      keys arriving by a different mechanism from the other six (window_months, lambda_mix,
      n_samples, seed, family, transform), which is a split convention rather than a boundary.

    Instead the catalog derives once in __init__ and reads regression_targets directly. Your two
    open questions resolve cleanly under that:

    • Ordering (regression then classification) — moot. 0 of 29 baseline configs declare
      classification_targets.
    • Models with no classification_targets — that is all of them, so nothing is dropped. No guard
      is added either: ZeroModel and LocfModel are perfectly valid classification baselines, and a
      catalog-level veto would block models that already work.

    3. Your "suggested check once fixed" became #88 — a conformance test constructing all seven
    builders from a realistic merged config. Worth noting why it belongs here rather than upstream:
    pipeline-core has registered the blindness itself (its C-289 — a repo "cannot see a consumer,
    because being imported by someone leaves no trace in your own source") and its conformance suite
    explicitly exempts views-baseline, pushing the check to our side, where it did not exist.

    Closing this when #86 merges.

  2. Polichinel commented on Sep 9, 2026

    @Polichinel
    ContributorAuthor

    Closed by #94, merged to development (2b3d3b4). CI green: check (3.11), lint, build, check-branch all pass — the first green Lint and Test since 2026-08-02. Suite 248 → 295 passed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions