Skip to content

Run CI on claude/spec-driven-engine and raise Python floor to 3.12#75

Open
MaxGhenis wants to merge 3 commits into
claude/spec-driven-enginefrom
ci-trunk-python-floor
Open

Run CI on claude/spec-driven-engine and raise Python floor to 3.12#75
MaxGhenis wants to merge 3 commits into
claude/spec-driven-enginefrom
ci-trunk-python-floor

Conversation

@MaxGhenis

Copy link
Copy Markdown
Contributor

What

  1. Run CI on claude/spec-driven-engine. The Tests workflow only triggered on main, but the last ~30 PRs (Add provider-backed source registry #44Resolve observation frames for entity bundles #74) merge into claude/spec-driven-engine — so the entire spec engine has landed with zero CI runs since May 31. This adds the integration branch to the push/pull_request triggers so every PR into it (including this one) runs the suite.

  2. Align the Python floor with reality. requires-python claimed >=3.11, but microimpute — the canonical donor-imputation backend the spec engine depends on — only installs on 3.12 <= python < 3.15 via its environment marker, so a 3.11 install silently lacks the imputation engine. This bumps requires-python to >=3.12, drops 3.11 from the CI matrix and classifiers, bumps the docs workflow Python (3.11 can no longer pip install -e .), and aligns the mypy target.

Why now

Flagged in an architecture review (2026-06-09): CI-on-trunk is the highest-leverage safety fix available — it removes the silent-breakage class entirely (the same class that produced the stale packs/usmicroplex-us spec divergence).

Notes

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits June 9, 2026 23:25
The Tests workflow only triggered on main while all integration PRs
merge into claude/spec-driven-engine, so the spec engine has been
landing without CI. Add the branch to the workflow triggers.

requires-python claimed >=3.11 but microimpute (the canonical donor
imputation backend) only installs on 3.12-3.14 via its marker, leaving
3.11 installs without the imputation engine. Raise the floor to 3.12
and align the CI matrix, classifiers, docs workflow, and mypy target.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
tests/spec/test_spec.py and tests/targets/test_spec.py share a module
basename, and neither directory was a package, so pytest's whole-suite
collection failed with an import file mismatch. tests/ already uses
package-style test directories (tests/__init__.py, tests/fusion/);
bring core/, spec/, and targets/ in line. The full suite has been
uncollectable since the duplicate basename landed - masked because CI
never ran on this branch and local runs targeted tests/spec/ only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

First full-suite CI run on this branch: 41 failed / 1,029 passed / 123 skipped (after the __init__.py fix made the suite collectable at all — it previously died at collection on the tests/{spec,targets}/test_spec.py basename collision).

All 41 failures are one root cause, not 41 problems:

src/microplex/imputation.py:443: in _make_imputer
    return Imputer(seed=self.seed, log_level="WARNING")
E   TypeError: Can't instantiate abstract class Imputer without an implementation for abstract method '_fit'

The engine instantiates microimpute.Imputer directly as the canonical regime-gated imputer — but on PyPI's microimpute==3.1.1 (what pip install -e ".[dev]" resolves), Imputer is still an abstract base class. The concrete canonical Imputer lives on the unreleased claude/imputer-canonical branch (PolicyEngine/microimpute#196), which is what local dev runs against via the editable install documented in docs/spec-driven-rebuild-progress.md.

So the failures are the declared dependency surface telling the truth: the spec engine cannot run against any released microimpute. Unblock path:

  1. Merge Make microimpute.Imputer the canonical regime-gated sequential imputer microimpute#196 and let it auto-release.
  2. Bump this repo's pin from microimpute>=3.1.1 to the released version.
  3. Re-run — the 41 spec/imputation failures should clear together.

I deliberately did not skip/xfail these tests — masking them would hide exactly the signal this workflow exists to give.

🤖 Generated with Claude Code

The suite's 41 failures came from pip resolving microimpute from PyPI
(3.1.1, abstract Imputer) while [tool.uv.sources] pins the git rev with
the concrete canonical Imputer the engine instantiates. pip ignores
tool.uv.sources; uv honors it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.

1 participant