From 51704f2acce0bab319c9f13e5edd765467beac44 Mon Sep 17 00:00:00 2001 From: Zachariah Farahany Date: Sun, 8 Nov 2026 14:59:50 -0500 Subject: [PATCH 1/4] feat(eval): pydantic-settings task on pydantic 2.14 (MIT-618 WIP) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Qc1CQTb8r67J32HpkhS43y --- tools/eval/github_tasks.py | 52 +++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/tools/eval/github_tasks.py b/tools/eval/github_tasks.py index 5a6335f..935b3c3 100644 --- a/tools/eval/github_tasks.py +++ b/tools/eval/github_tasks.py @@ -111,6 +111,56 @@ def tests(*ids: str) -> str: ) +# Pydantic 2.14.0 (2026-10-08) added a required `validate_by_alias` argument to the private +# helper `pydantic._internal._signature._field_name_for_signature`: pydantic/pydantic#13730, +# merged 2026-08-29. Release notes: https://github.com/pydantic/pydantic/releases/tag/v2.14.0 +PYDANTIC_SIGNATURE_HELPER = Upstream( + library="pydantic", + version="2.14.0", + released="2026-10-08", + changelog="https://github.com/pydantic/pydantic/releases/tag/v2.14.0", + upstream_change="pydantic-2.14-field-name-for-signature", +) + +# Issue: https://github.com/pydantic/pydantic-settings/issues/1023 (2026-10-09): `CliApp.run` +# raises TypeError for any plain BaseModel command. +# Fix: https://github.com/pydantic/pydantic-settings/pull/1029 (squash-merged 2026-10-13): +# `CliApp.run` maps fields to init kwargs itself instead of calling the private helper. +# Only the new `validate_by_name_only` test runs: it passes at the base on Pydantic 2.13.5 +# (checked) and fails on 2.14.0. The PR's alias test also fails at the base on 2.13.5 (a +# non-identifier alias never worked), so it is left out. +# The TypeError names the missing argument, so it points at a fix: not a hard-set task under +# decision 0023. Cause words name the change, not the helper or the argument. +PYDANTIC_SETTINGS = GitHubTask( + name="gh-pydantic-settings-signature", + repo="https://github.com/pydantic/pydantic-settings", + base_commit="10dc635dc3160f4414e4c50b65605729274c9afc", + fix_commit="f0dd3824b3cdacd65a4bda730a9754a1cfdcda13", + issue_url="https://github.com/pydantic/pydantic-settings/issues/1023", + fix_url="https://github.com/pydantic/pydantic-settings/pull/1029", + test_paths=("tests/test_source_cli.py",), + python="3.12", + pins=("pydantic==2.14.0",), + setup=f"uv pip install --quiet {EXCLUDE_NEWER} -e . pytest==9.1.1", + test_command=tests( + "tests/test_source_cli.py::test_cli_app_run_base_model_validate_by_name_only" + ), + upstream=PYDANTIC_SIGNATURE_HELPER, + discovery=Discovery( + symptom_words=( + "TypeError", + "_field_name_for_signature", + "validate_by_alias", + "missing 1 required positional argument", + ), + cause_words=("2.14", "private", "added a required", "new required"), + library="pydantic", + ), + trigger="version_specific", + license="MIT", +) + + # Polars 2.0.0 (2026-10-06; first release candidate 2026-09-02): a lazy query's collect now # runs on the streaming engine, which doesn't keep a join's row order unless the join passes # `maintain_order`. Upgrade guide, "The Lazy API defaults to the streaming engine": @@ -167,6 +217,6 @@ def scenario(task: GitHubTask) -> Scenario: ) -TASKS: list[GitHubTask] = [PYTEST_BDD, TEKORE, MLODA] +TASKS: list[GitHubTask] = [PYTEST_BDD, TEKORE, PYDANTIC_SETTINGS, MLODA] GITHUB = {task.name: scenario(task) for task in TASKS} From 064811d9437d3fe2b97f8f30ec7d61af6b1fd830 Mon Sep 17 00:00:00 2001 From: Zachariah Farahany Date: Sun, 8 Nov 2026 15:07:15 -0500 Subject: [PATCH 2/4] feat(eval): project-x-py task on polars 2.0 pl.count (MIT-618 WIP) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Qc1CQTb8r67J32HpkhS43y --- tools/eval/github_tasks.py | 58 +++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/tools/eval/github_tasks.py b/tools/eval/github_tasks.py index 935b3c3..04301cc 100644 --- a/tools/eval/github_tasks.py +++ b/tools/eval/github_tasks.py @@ -204,6 +204,62 @@ def tests(*ids: str) -> str: ) +# Polars 2.0.0 (2026-10-06): `pl.count()` with no argument, deprecated since 0.20.5 in favour of +# `pl.len()`, now raises TypeError. Upgrade guide: https://docs.pola.rs/releases/upgrade/2/ +# (release: https://github.com/pola-rs/polars/releases/tag/py-2.0.0) +POLARS_COUNT = Upstream( + library="polars", + version="2.0.0", + released="2026-10-06", + changelog="https://docs.pola.rs/releases/upgrade/2/", + upstream_change="polars-2.0-count-needs-argument", +) + +# Issue: none in the repository; the fix's pull request (opened 2026-10-15) reports it, from the +# Dependabot bump to Polars 2.0.0 (TexasCoding/project-x-py#162): `MarketAnalytics.get_statistics` +# returns {'error': 'Analysis failed'}, its TypeError only in the captured log. +# Fix: https://github.com/TexasCoding/project-x-py/pull/168 (merged 2026-10-15), `pl.len()` for +# the trade counts; the test gains assertions on those counts. The test passes at the base on +# Polars 1.44.2 (checked) and fails on 2.0.0. +# The TypeError, in the captured log, says to use `pl.len()`: the error names its fix, so this is +# not a hard-set task under decision 0023. Not "2.0": the test data holds prices like 21002.0. +# The install is about 280 MB, 169 MB of it Polars' runtime. +PROJECT_X = GitHubTask( + name="gh-project-x-count", + repo="https://github.com/TexasCoding/project-x-py", + base_commit="e6c1da2e267f6506075f9e15e365ff8f49ccb3e3", + fix_commit="4b3d553baad090e0406ecb646674c8f90cfb7fe0", + issue_url="https://github.com/TexasCoding/project-x-py/pull/168", + fix_url="https://github.com/TexasCoding/project-x-py/pull/168", + test_paths=("tests/orderbook/test_orderbook_analytics.py",), + python="3.12", + pins=("polars==2.0.0",), + setup=( + f"uv pip install --quiet {EXCLUDE_NEWER} -e . " + "pytest==9.1.1 pytest-asyncio pytest-cov pytest-mock" + ), + test_command=tests( + "tests/orderbook/test_orderbook_analytics.py::TestStatisticalSummaries::test_get_statistics" + ), + upstream=POLARS_COUNT, + discovery=Discovery( + symptom_words=("Analysis failed", "TypeError", "pl.count()", "at least one argument"), + cause_words=( + "polars 2", + "deprecat", + "no longer", + "argument-less", + "without an argument", + "without arguments", + "no arguments", + ), + library="polars", + ), + trigger="version_specific", + license="MIT", +) + + def scenario(task: GitHubTask) -> Scenario: """Return the scenario that replays a task: its project comes from the repository.""" return Scenario( @@ -217,6 +273,6 @@ def scenario(task: GitHubTask) -> Scenario: ) -TASKS: list[GitHubTask] = [PYTEST_BDD, TEKORE, PYDANTIC_SETTINGS, MLODA] +TASKS: list[GitHubTask] = [PYTEST_BDD, TEKORE, PYDANTIC_SETTINGS, MLODA, PROJECT_X] GITHUB = {task.name: scenario(task) for task in TASKS} From c28da1d0ebd1bfae1f0137beb04f8c23d7f83574 Mon Sep 17 00:00:00 2001 From: Zachariah Farahany Date: Sun, 8 Nov 2026 15:13:47 -0500 Subject: [PATCH 3/4] fix(eval): drop the project-x-py task, its fix predates the cutoff (MIT-618) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Qc1CQTb8r67J32HpkhS43y --- tools/eval/github_tasks.py | 58 +------------------------------------- 1 file changed, 1 insertion(+), 57 deletions(-) diff --git a/tools/eval/github_tasks.py b/tools/eval/github_tasks.py index 04301cc..935b3c3 100644 --- a/tools/eval/github_tasks.py +++ b/tools/eval/github_tasks.py @@ -204,62 +204,6 @@ def tests(*ids: str) -> str: ) -# Polars 2.0.0 (2026-10-06): `pl.count()` with no argument, deprecated since 0.20.5 in favour of -# `pl.len()`, now raises TypeError. Upgrade guide: https://docs.pola.rs/releases/upgrade/2/ -# (release: https://github.com/pola-rs/polars/releases/tag/py-2.0.0) -POLARS_COUNT = Upstream( - library="polars", - version="2.0.0", - released="2026-10-06", - changelog="https://docs.pola.rs/releases/upgrade/2/", - upstream_change="polars-2.0-count-needs-argument", -) - -# Issue: none in the repository; the fix's pull request (opened 2026-10-15) reports it, from the -# Dependabot bump to Polars 2.0.0 (TexasCoding/project-x-py#162): `MarketAnalytics.get_statistics` -# returns {'error': 'Analysis failed'}, its TypeError only in the captured log. -# Fix: https://github.com/TexasCoding/project-x-py/pull/168 (merged 2026-10-15), `pl.len()` for -# the trade counts; the test gains assertions on those counts. The test passes at the base on -# Polars 1.44.2 (checked) and fails on 2.0.0. -# The TypeError, in the captured log, says to use `pl.len()`: the error names its fix, so this is -# not a hard-set task under decision 0023. Not "2.0": the test data holds prices like 21002.0. -# The install is about 280 MB, 169 MB of it Polars' runtime. -PROJECT_X = GitHubTask( - name="gh-project-x-count", - repo="https://github.com/TexasCoding/project-x-py", - base_commit="e6c1da2e267f6506075f9e15e365ff8f49ccb3e3", - fix_commit="4b3d553baad090e0406ecb646674c8f90cfb7fe0", - issue_url="https://github.com/TexasCoding/project-x-py/pull/168", - fix_url="https://github.com/TexasCoding/project-x-py/pull/168", - test_paths=("tests/orderbook/test_orderbook_analytics.py",), - python="3.12", - pins=("polars==2.0.0",), - setup=( - f"uv pip install --quiet {EXCLUDE_NEWER} -e . " - "pytest==9.1.1 pytest-asyncio pytest-cov pytest-mock" - ), - test_command=tests( - "tests/orderbook/test_orderbook_analytics.py::TestStatisticalSummaries::test_get_statistics" - ), - upstream=POLARS_COUNT, - discovery=Discovery( - symptom_words=("Analysis failed", "TypeError", "pl.count()", "at least one argument"), - cause_words=( - "polars 2", - "deprecat", - "no longer", - "argument-less", - "without an argument", - "without arguments", - "no arguments", - ), - library="polars", - ), - trigger="version_specific", - license="MIT", -) - - def scenario(task: GitHubTask) -> Scenario: """Return the scenario that replays a task: its project comes from the repository.""" return Scenario( @@ -273,6 +217,6 @@ def scenario(task: GitHubTask) -> Scenario: ) -TASKS: list[GitHubTask] = [PYTEST_BDD, TEKORE, PYDANTIC_SETTINGS, MLODA, PROJECT_X] +TASKS: list[GitHubTask] = [PYTEST_BDD, TEKORE, PYDANTIC_SETTINGS, MLODA] GITHUB = {task.name: scenario(task) for task in TASKS} From 0556e4a1e135de4ebb006cc15d6b29c5ef115ab6 Mon Sep 17 00:00:00 2001 From: Zachariah Farahany Date: Sun, 8 Nov 2026 15:22:20 -0500 Subject: [PATCH 4/4] fix(eval): pydantic-settings cause words drop "private" (MIT-618) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Qc1CQTb8r67J32HpkhS43y --- tools/eval/github_tasks.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/eval/github_tasks.py b/tools/eval/github_tasks.py index 935b3c3..8f31851 100644 --- a/tools/eval/github_tasks.py +++ b/tools/eval/github_tasks.py @@ -130,7 +130,9 @@ def tests(*ids: str) -> str: # (checked) and fails on 2.14.0. The PR's alias test also fails at the base on 2.13.5 (a # non-identifier alias never worked), so it is left out. # The TypeError names the missing argument, so it points at a fix: not a hard-set task under -# decision 0023. Cause words name the change, not the helper or the argument. +# decision 0023. Cause words name the change, not the helper or the argument. Not "private" or +# "signature": the traceback ends in `pydantic/_internal/_signature.py`, so a fix that only +# describes the symptom would say them. PYDANTIC_SETTINGS = GitHubTask( name="gh-pydantic-settings-signature", repo="https://github.com/pydantic/pydantic-settings", @@ -153,7 +155,7 @@ def tests(*ids: str) -> str: "validate_by_alias", "missing 1 required positional argument", ), - cause_words=("2.14", "private", "added a required", "new required"), + cause_words=("2.14", "added a required", "new required"), library="pydantic", ), trigger="version_specific",