diff --git a/.github/workflows/autofix-versions.env b/.github/workflows/autofix-versions.env index 895eb45cc..2750d2be7 100644 --- a/.github/workflows/autofix-versions.env +++ b/.github/workflows/autofix-versions.env @@ -5,11 +5,11 @@ # Runtime dependencies (PyYAML, Pydantic, Hypothesis) should be managed via Dependabot # in each consumer repo's pyproject.toml directly, NOT synced from this file. BLACK_VERSION=26.5.1 -RUFF_VERSION=0.15.20 +RUFF_VERSION=0.15.21 ISORT_VERSION=8.0.1 DOCFORMATTER_VERSION=1.7.8 -MYPY_VERSION=2.1.0 +MYPY_VERSION=2.3.0 PYTEST_VERSION=9.1.1 PYTEST_COV_VERSION=7.1.0 PYTEST_XDIST_VERSION=3.8.0 -COVERAGE_VERSION=7.15.1 +COVERAGE_VERSION=7.15.2 diff --git a/langsmith-fleet-worker-attempt.json b/langsmith-fleet-worker-attempt.json index 35abb6a54..dfc8b78b9 100644 --- a/langsmith-fleet-worker-attempt.json +++ b/langsmith-fleet-worker-attempt.json @@ -1,16 +1,16 @@ { "agent": "codex", "cli_version": "0.125.0", - "emitted_at": "2026-07-15T21:30:40.959289Z", + "emitted_at": "2026-07-17T11:46:38.767778Z", "execution_profile": "codex-default", "fallback_models": [ "gpt-5.4" ], "operation_role": "worker", - "pr_number": "2781", + "pr_number": "2782", "requested_model": "gpt-5.5", "runner": "reusable-codex-run", "schema": "langsmith-fleet/v1", - "selected_model": "", - "selection_reason": "" + "selected_model": "gpt-5.5", + "selection_reason": "input" } diff --git a/pyproject.toml b/pyproject.toml index 43157de04..c1e4ebe45 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,14 +31,14 @@ app = [] dev = [ "pre-commit==4.6.0", "black==26.5.1", - "ruff==0.15.20", + "ruff==0.15.21", "isort==8.0.1", "docformatter==1.7.8", - "mypy==2.1.0", + "mypy==2.3.0", "flake8==7.3.0", "pytest==9.1.1", "pytest-cov==7.1.0", - "coverage==7.15.1", + "coverage==7.15.2", "pytest-xdist==3.8.0", "packaging>=26.1", diff --git a/requirements.lock b/requirements.lock index 1147a1f48..1d36f5870 100644 --- a/requirements.lock +++ b/requirements.lock @@ -43,7 +43,7 @@ colorama==0.4.6 ; sys_platform == 'win32' # click # pytest # tqdm -coverage==7.15.1 +coverage==7.15.2 # via # workflows (pyproject.toml) # pytest-cov @@ -175,7 +175,7 @@ multidict==6.7.1 # via # aiohttp # yarl -mypy==2.1.0 +mypy==2.3.0 # via workflows (pyproject.toml) mypy-extensions==1.1.0 # via @@ -298,7 +298,7 @@ rpds-py==2026.6.3 # via # jsonschema # referencing -ruff==0.15.20 +ruff==0.15.21 # via workflows (pyproject.toml) six==1.17.0 # via python-dateutil diff --git a/scripts/sync_tool_versions.py b/scripts/sync_tool_versions.py index 08e974265..e14c7590e 100644 --- a/scripts/sync_tool_versions.py +++ b/scripts/sync_tool_versions.py @@ -14,6 +14,8 @@ PIN_FILE = Path(".github/workflows/autofix-versions.env") PYPROJECT_FILE = Path("pyproject.toml") +# Consumer-template pins are intentionally repo-specific; see AGENTS.md. +# They must not be overwritten or compared to Workflows' own pins. TEMPLATE_FILE = Path("templates/consumer-repo/.github/workflows/autofix-versions.env") INTEGRATION_TEMPLATE_FILE = Path( "templates/integration-repo/.github/workflows/autofix-versions.env" @@ -241,7 +243,7 @@ def main(argv: Iterable[str]) -> int: source_content = PIN_FILE.read_text(encoding="utf-8") template_mismatches: dict[str, str] = {} template_updates = False - for template_file in (TEMPLATE_FILE, INTEGRATION_TEMPLATE_FILE): + for template_file in (INTEGRATION_TEMPLATE_FILE,): mismatches, updated = ensure_template(source_content, template_file, apply_changes) template_mismatches.update(mismatches) template_updates = template_updates or updated diff --git a/templates/integration-repo/.github/workflows/autofix-versions.env b/templates/integration-repo/.github/workflows/autofix-versions.env index 895eb45cc..2750d2be7 100644 --- a/templates/integration-repo/.github/workflows/autofix-versions.env +++ b/templates/integration-repo/.github/workflows/autofix-versions.env @@ -5,11 +5,11 @@ # Runtime dependencies (PyYAML, Pydantic, Hypothesis) should be managed via Dependabot # in each consumer repo's pyproject.toml directly, NOT synced from this file. BLACK_VERSION=26.5.1 -RUFF_VERSION=0.15.20 +RUFF_VERSION=0.15.21 ISORT_VERSION=8.0.1 DOCFORMATTER_VERSION=1.7.8 -MYPY_VERSION=2.1.0 +MYPY_VERSION=2.3.0 PYTEST_VERSION=9.1.1 PYTEST_COV_VERSION=7.1.0 PYTEST_XDIST_VERSION=3.8.0 -COVERAGE_VERSION=7.15.1 +COVERAGE_VERSION=7.15.2 diff --git a/tests/scripts/test_sync_tool_versions.py b/tests/scripts/test_sync_tool_versions.py index b07552446..cdbcb97fe 100644 --- a/tests/scripts/test_sync_tool_versions.py +++ b/tests/scripts/test_sync_tool_versions.py @@ -241,6 +241,32 @@ def test_main_check_ok( assert captured.err == "" +def test_main_allows_consumer_template_pin_divergence( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str] +) -> None: + env_path = tmp_path / "pins.env" + pyproject_path = tmp_path / "pyproject.toml" + consumer_template = tmp_path / "consumer.env" + integration_template = tmp_path / "integration.env" + env_versions = {cfg.env_key: "6.0" for cfg in sync_tool_versions.TOOL_CONFIGS} + consumer_versions = env_versions | {"RUFF_VERSION": "5.0"} + + _write_env_file(env_path, env_versions) + _write_env_file(consumer_template, consumer_versions) + _write_env_file(integration_template, env_versions) + pyproject_path.write_text(_make_pyproject_content(env_versions), encoding="utf-8") + + monkeypatch.setattr(sync_tool_versions, "PIN_FILE", env_path) + monkeypatch.setattr(sync_tool_versions, "PYPROJECT_FILE", pyproject_path) + monkeypatch.setattr(sync_tool_versions, "TEMPLATE_FILE", consumer_template) + monkeypatch.setattr( + sync_tool_versions, "INTEGRATION_TEMPLATE_FILE", integration_template + ) + + assert sync_tool_versions.main(["--check"]) == 0 + assert capsys.readouterr().err == "" + + def test_main_apply_no_changes( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str] ) -> None: @@ -286,10 +312,10 @@ def test_main_rejects_check_and_apply_together() -> None: sync_tool_versions.main(["--check", "--apply"]) -def test_template_sync_detects_mismatch( +def test_managed_integration_template_sync_detects_mismatch( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str] ) -> None: - """Test that template file mismatch is detected.""" + """Test that the managed integration template mismatch is detected.""" env_path = tmp_path / "pins.env" pyproject_path = tmp_path / "pyproject.toml" template_path = tmp_path / "templates" / "autofix-versions.env" @@ -303,7 +329,7 @@ def test_template_sync_detects_mismatch( monkeypatch.setattr(sync_tool_versions, "PIN_FILE", env_path) monkeypatch.setattr(sync_tool_versions, "PYPROJECT_FILE", pyproject_path) - monkeypatch.setattr(sync_tool_versions, "TEMPLATE_FILE", template_path) + monkeypatch.setattr(sync_tool_versions, "INTEGRATION_TEMPLATE_FILE", template_path) exit_code = sync_tool_versions.main(["--check"]) captured = capsys.readouterr() @@ -312,10 +338,10 @@ def test_template_sync_detects_mismatch( assert "template" in captured.err -def test_template_sync_apply_updates_template( +def test_integration_template_sync_apply_updates_template( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str] ) -> None: - """Test that --apply syncs template from source.""" + """Test that --apply syncs the managed integration template from source.""" env_path = tmp_path / "pins.env" pyproject_path = tmp_path / "pyproject.toml" template_path = tmp_path / "templates" / "autofix-versions.env" @@ -329,7 +355,7 @@ def test_template_sync_apply_updates_template( monkeypatch.setattr(sync_tool_versions, "PIN_FILE", env_path) monkeypatch.setattr(sync_tool_versions, "PYPROJECT_FILE", pyproject_path) - monkeypatch.setattr(sync_tool_versions, "TEMPLATE_FILE", template_path) + monkeypatch.setattr(sync_tool_versions, "INTEGRATION_TEMPLATE_FILE", template_path) exit_code = sync_tool_versions.main(["--apply"]) captured = capsys.readouterr()