DEV Community

The Dev Signal
The Dev Signal

Posted on • Originally published at thedevsignal.com

Ruff 0.6 stabilizes notebook linting, new SDKs ship

This week's releases split neatly into two themes: Python tooling getting quieter (Ruff shipping defaults that just work) and the multimodal model landscape getting louder (NVIDIA and Microsoft both dropping production-ready omnimodal systems the same week). Throw in a Kotlin ADK, a Swift distributed workflow SDK, and Biome eating two more tool categories, and you have a week where the boring infrastructure upgrades matter as much as the flashy model drops.


Ruff v0.6.0 stabilizes notebook linting, drops rules

Ruff 0.6 makes Jupyter notebook linting a first-class default. Previously you had to opt in via extend-include = ["*.ipynb"]; now notebooks are linted automatically without touching your config. Three rules are deprecated outright, and nine pylint-derived rules graduate from preview to stable.

The part most likely to bite you: pytest decorator rules PT001 and PT023 now enforce the style the official pytest docs recommend, which means existing codebases with mixed decorator styles will surface new violations. The fix is mechanical — run ruff check . --fix --select=PT001 --select=PT023 and review the diff. Also worth checking: src/ layout projects will now have those directories searched by default when resolving first-party imports, which can alter isort behavior silently.

Verdict: Ship. Drop-in upgrade for most projects. Run the PT001/PT023 fix pass first, verify isort output hasn't shifted on your import blocks, then merge.


Ruff v0.8.0 defaults to Python 3.9

Ruff 0.8 bumps the implicit target-version from py38 to py39. If you haven't set requires-python in your pyproject.toml or target-version in [tool.ruff], you will see formatting and linting changes on your next run — parenthesized with statements, reordered imports, and new rule complaints on code that was clean yesterday.

This is the kind of silent default change that lands in CI as a surprise diff. The fix is one line either way: add target-version = "py38" under [tool.ruff] to preserve current behavior, or declare requires-python = ">= 3.9" in [project] and accept the new formatting baseline. The latter is the right long-term move for most codebases at this point.

Verdict: Ship, but pin your version explicitly before upgrading. Don't let this land in a branch that's already open — the formatting delta will pollute your diff.


Biome v2.4 embeds CSS and GraphQL linting

Biome now formats and lints CSS-in-JS template literals (styled-components) and GraphQL tags natively via the experimentalEmbeddedSnippetsEnabled flag. That eliminates the separate prettier-plugin-graphql and stylelint passes that polyglot JS files typically require. The same release ships HTML a11y rules and improved Vue/Svelte parser accuracy, cutting false positives in component-heavy repos.

The migration path is straightforward: upgrade to 2.4.0, run biome migrate --write, and add the experimental flag to biome.json. The embedded snippets feature is flagged as experimental, but the underlying CSS and GraphQL formatters are stable — the risk surface is narrow.

Verdict: Ship for CSS-in-JS teams. If you're maintaining a styled-components or graphql-tag codebase and running multiple formatters today, the consolidation is worth the migration cost now. HTML support is experimental; treat it as an evaluate.


Temporal Swift SDK now handles distributed workflows

The Temporal Swift SDK brings durable workflow execution to native Swift services. You define workflow logic as ordinary async/await Swift functions; Temporal handles retries, state persistence, and recovery from partial failures automatically. No hand-rolled retry loops, no external state machines, no custom checkpoint logic.

The practical target here is production backend services — payment processing, data pipelines, anything where partial failure mid-sequence is expensive to debug and recover from manually. The SDK requires a running Temporal server (self-hosted or Temporal Cloud) and async/await familiarity, neither of which is a high bar if you're already building Swift backend services.

Verdict: Evaluate if you're running Swift on the server with multi-step operations. It replaces real architectural complexity. If you don't have Temporal infrastructure already, factor in that setup cost — it's not trivial for a greenfield service, but it's worthwhile if distributed coordination is a recurring problem.


NVIDIA Cosmos 3 and Microsoft MAI models ship

Two different multimodal strategies landed the same week. NVIDIA's Cosmos 3 is a single open omnimodal model handling text, images, video, audio, and actions — positioned for physical AI systems and robotics pipelines where you want one model handling multiple modalities without stitching separate inference endpoints together. Microsoft's MAI models are the opposite approach: modality-specific production models (image editing, voice, transcription) deployed now across Azure AI Foundry, Fireworks AI, Baseten, and OpenRouter.

If you're building a robotics or simulation pipeline and can absorb the open-source inference costs, Cosmos 3 eliminates the glue code between separate text-to-image and image-to-video models. If you're adding voice or vision to an existing application and want managed deployment with known SLAs, the MAI models are available today on infrastructure you likely already use.

Verdict: Evaluate both immediately if multimodal is on your roadmap. Cosmos 3 is the right call if you need unified modality handling and control over your inference stack. MAI is the right call if you need production availability without standing up new infrastructure.


ADK for Kotlin brings agentic workflows to backend

Google's Agent Development Kit 0.1.0 for Kotlin ships a LlmAgent interface that abstracts routing between cloud Gemini models and on-device Gemini Nano, handling context management and API adaptation transparently. Sequential agents, retrieval agents, session state, and OpenTelemetry instrumentation are all included. The @Tool annotation generates the boilerplate via KSP at compile time.

The compelling case is hybrid cloud-edge architectures where you want local inference for sensitive data and cloud reasoning for complex tasks, without writing separate agent definitions for each target. Adding the gradle dependency (com.google.adk:google-adk-kotlin-core:0.1.0) plus the KSP processor is the full setup cost.

Verdict: Evaluate now, especially for Android-adjacent backend work. It's 0.1.0, so expect API churn, but the feature set is complete enough to prototype real systems. If you're hand-rolling cloud-to-device inference routing today, this replaces that architecture.


If this kind of signal-to-noise ratio is useful for your work, Dev Signal publishes every week at thedevsignal.com — subscribe to get the next issue before your standup.

Top comments (0)