Skip to content
CAI
Software that uses CAICheck a score

pola-rs/polars

66.9

Adequate · 29 July 2026

503.3k

lines of production code

Rust

with Python

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

How this codebase got here

Score

  • CAI 62 → 67 (+4.9)
  • Rubric changed (rubric-2026.08.17 → rubric-2026.08.18) — scores are not directly comparable.

Lenses

  • Code Health 72 → 70 (-1.9)
  • Architecture 98 → 97 (-1.3)
  • Maturity 72 → 68 (-4.1)
  • Readiness 71 → 83 (+12.1)
  • Security 48 → 58 (+11.0)
  • Domain Modelling 100 → 100 (+0.0)

Resolved (122)

  • AExpr.is_equal_node (cyclomatic 22) (crates/polars-plan/src/plans/visitor/expr.rs)
  • ApplyExpr.apply_multiple_group_aware (cognitive 17) (crates/polars-expr/src/expressions/apply.rs)
  • BinviewKeyIdxTable.insert_keys_subset (cognitive 17) (crates/polars-expr/src/idx_table/binview.rs)
  • BlockUnion.get (cyclomatic 17) (crates/polars-compute/src/rolling/quantile_filter.rs)
  • Boundary-crossing change coupling: mod.rs ↔ _plr.py (crates/polars-python/src/c_api/mod.rs)
  • Bridge.run_impl (cognitive 16) (crates/polars-stream/src/nodes/io_sources/multi_scan/pipeline/tasks/bridge.rs)
  • Change coupling: anonymous_scan.rs ↔ csv.rs (crates/polars-lazy/src/scan/anonymous_scan.rs)
  • Change coupling: anonymous_scan.rs ↔ ipc.rs (crates/polars-lazy/src/scan/anonymous_scan.rs)
  • Change coupling: anonymous_scan.rs ↔ ndjson.rs (crates/polars-lazy/src/scan/anonymous_scan.rs)
  • Change coupling: anonymous_scan.rs ↔ parquet.rs (crates/polars-lazy/src/scan/anonymous_scan.rs)
  • Change coupling: fmt.rs ↔ to_graph.rs (crates/polars-stream/src/physical_plan/fmt.rs)
  • Change coupling: functions.rs ↔ ir_to_dsl.rs (crates/polars-plan/src/plans/conversion/dsl_to_ir/functions.rs)
  • Change coupling: mod.rs ↔ mod.rs (crates/polars-core/src/series/ops/mod.rs)
  • Change coupling: mod.rs ↔ mod.rs (crates/polars-stream/src/nodes/mod.rs)
  • Change coupling: mod.rs ↔ to_graph.rs (crates/polars-stream/src/nodes/mod.rs)
  • ChunkedArray.agg_max (cyclomatic 16) (crates/polars-core/src/frame/group_by/aggregations/mod.rs)
  • CloudOptions.build_aws (cyclomatic 16) (crates/polars-io/src/cloud/options.rs)
  • Column.arg_sort (cyclomatic 16) (crates/polars-core/src/frame/column/mod.rs)
  • ConcurrencyController.spawn_control_loop (cyclomatic 18) (crates/polars-io/src/cloud/concurrency/mod.rs)
  • DataTypeExpr.fmt (cyclomatic 19) (crates/polars-plan/src/dsl/datatype_expr.rs)
  • …and 102 more

New (174)

  • Boundary-crossing change coupling: array.rs ↔ array.py (crates/polars-plan/src/dsl/array.rs)
  • Boundary-crossing change coupling: array.rs ↔ array.py (crates/polars-plan/src/dsl/function_expr/array.rs)
  • Boundary-crossing change coupling: array.rs ↔ array.py (crates/polars-python/src/expr/array.rs)
  • Boundary-crossing change coupling: array.rs ↔ array.py (crates/polars-python/src/expr/array.rs)
  • Boundary-crossing change coupling: list.rs ↔ list.py (crates/polars-python/src/expr/list.rs)
  • Boundary-crossing change coupling: list.rs ↔ list.py (crates/polars-python/src/expr/list.rs)
  • Boundary-crossing change coupling: meta.rs ↔ meta.py (crates/polars-python/src/expr/meta.rs)
  • Boundary-crossing change coupling: mod.rs ↔ array.py (crates/polars-ops/src/chunked_array/array/mod.rs)
  • Boundary-crossing change coupling: options.rs ↔ frame.py (crates/polars-io/src/parquet/write/options.rs)
  • Boundary-crossing change coupling: string.rs ↔ string.py (crates/polars-python/src/expr/string.rs)
  • Build action pinned to a mutable branch
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • FileTooLong: aexpr/filter_constraint.rs (crates/polars-plan/src/plans/aexpr/filter_constraint.rs)
  • FileTooLong: aexpr/schema.rs (crates/polars-plan/src/plans/aexpr/schema.rs)
  • FileTooLong: aggregations/mod.rs (crates/polars-core/src/frame/group_by/aggregations/mod.rs)
  • FileTooLong: arithmetic/borrowed.rs (crates/polars-core/src/series/arithmetic/borrowed.rs)
  • FileTooLong: arithmetic/list.rs (crates/polars-core/src/series/arithmetic/list.rs)
  • FileTooLong: array/static_array_collect.rs (crates/polars-arrow/src/array/static_array_collect.rs)
  • FileTooLong: binview/mod.rs (crates/polars-parquet/src/arrow/read/deserialize/binview/mod.rs)
  • FileTooLong: cast/mod.rs (crates/polars-compute/src/cast/mod.rs)
  • …and 154 more

Changes since last survey

  • 51 commits — 22 feature/other, 29 fixes

By area

  • crates/polars-plan — 17 commits
  • docs/source — 4 commits
  • py-polars/tests — 4 commits
  • crates/polars-stream — 3 commits
  • py-polars/src — 3 commits
  • (root) — 2 commits
  • crates/polars-async — 2 commits
  • crates/polars-core — 2 commits
  • crates/polars-mem-engine — 2 commits
  • crates/polars-ops — 2 commits
  • crates/polars-python — 2 commits
  • crates/polars-sql — 2 commits
  • crates/polars-expr — 1 commit
  • crates/polars-io — 1 commit
  • crates/polars-parquet — 1 commit
  • crates/polars-time — 1 commit
  • crates/polars-utils — 1 commit
  • py-polars/runtime — 1 commit

Notable commits

  • fix: fix(rust): Add missing Send bounds in Connector (#28497)
  • fix: fix(rust): Decrement ParkGroup worker count when worker exits (#28492)
  • fix: fix(rust): Insert missing coercions from Unknown(_) in list/array arithmetic (#28411)
  • fix: fix: Address 3VL issue with SQL NOT IN interaction with NULL values and joins (#28484)
  • fix: fix: Avoid IEJoin rewrite for Categorical comparisons (#28427)
  • fix: fix: Avoid panic when union slice skips all rows (#28420)
  • fix: fix: Block predicate pushdown past overwritten window keys (#28429)
  • fix: fix: Check join schema by position (#28455)
  • fix: fix: Do not CSE non-column height expr on streaming engine (#28480)
  • fix: fix: Ensure SQL SUM and CORR aggregates return NULL for all-null inputs, add TOTAL (#28475)
  • fix: fix: Fix UB on first/last_non_null with empty chunk (#28495)
  • fix: fix: Fix dropped slice on multiple unions (#28477)
  • fix: fix: Fix high blocking thread use in sink_parquet with async local path (#28543)
  • fix: fix: Fix in-memory engine incorrect slice on maintain order join (#28478)
  • fix: fix: Fix panic on self join of scan_delta / scan_iceberg (#28468)
  • fix: fix: Flip nulls_last after Expr.reverse() (#28572)
  • fix: fix: Incorrect slicing when a join requires sorting (#28541)
  • fix: fix: Propagate is_scalar from the input to the output of .sort() and .sort_by() (#28438)
  • fix: fix: Propagate nulls_last in function_expr_sortedness (#28544)
  • fix: fix: Propagate adjusted sortedness through Gather (#28493)
  • …and 31 more

Architecture

  • Unchanged — 0 containers · 1 contexts · 0 edges

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

pola-rs/polars was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 29 July 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 138e72bee7e3c8e9059c28356463d405d8eeb080 — the exact code this score is about.
  • Scored under rubric-2026.08.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer latest.