This report summarizes scanner evidence for google-deepmind/weathernext, a Python project with 7,703 GitHub stars. SynthScan examined 23,607 lines of code across 77 source files, recording 304 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 14.8 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 301 finding(s).
Are imports declared and package/API names verified? 1 finding(s).
Are wrappers, guards, and repeated structures necessary? 187 finding(s).
Which changes need focused human review? 304 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 304 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | weathernext/cyclones/tracker_utils.py | 45 | def slice_data_array_latlon_box_with_lon_wraparound( | CODE |
| LOW | weathernext/cyclones/tracker_utils.py | 193 | def bilinear_interpolation_with_lon_wraparound( | CODE |
| LOW | weathernext/cyclones/tracker_utils.py | 267 | def _enforce_non_negativity_constraint(df: pd.DataFrame) -> pd.DataFrame: | CODE |
| LOW | weathernext/cyclones/tracker_utils.py | 299 | def _enforce_quadrant_radius_zero_if_wind_speed_below_threshold( | CODE |
| LOW | weathernext/cyclones/tracker_utils.py | 352 | def _enforce_quad_non_decreasing( | CODE |
| LOW | weathernext/cyclones/tracker_utils.py | 414 | def _enforce_rmw_smaller_than_quad_radii_by_clipping_rmw( | CODE |
| LOW | weathernext/cyclones/tracker_utils.py | 483 | def _enforce_rmw_smaller_than_quad_radii_by_clipping_quad_radii( | CODE |
| LOW | weathernext/cyclones/tracker_utils.py | 580 | def _wind_speeds_non_increasing_with_increasing_radii( | CODE |
| LOW | weathernext/cyclones/tracker_utils.py | 690 | def enforce_physical_consistency_on_quadrants_and_winds( | CODE |
| LOW | weathernext/cyclones/tracker_utils.py | 772 | def _check_quadrant_radii_and_radius_max_winds_are_consistent(df: pd.DataFrame): | CODE |
| LOW | weathernext/cyclones/tracker_utils.py | 798 | def _check_quadrant_radii_consistent(df: pd.DataFrame): | CODE |
| LOW | weathernext/cyclones/ibtracs_netcdf_to_csv.py | 71 | def convert_ibtracs_netcdf_to_csv_df( | CODE |
| LOW | weathernext/cyclones/ibtracs_netcdf_to_csv.py | 183 | def prepare_ibtracs_storms_dfs( | CODE |
| LOW | weathernext/cyclones/data_pipeline_utils.py | 96 | def create_grid_lat_and_lon_dimensions( | CODE |
| LOW | weathernext/cyclones/data_pipeline_utils.py | 141 | def convert_grid_data_to_packed_xarray_dataset( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_stages.py | 54 | def _scale_variables_from_nmiles_to_km( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_stages.py | 64 | def load_time_slice_from_ibtracs( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_stages.py | 214 | def cyclone_max_wind_speeds_max_wind_radii_and_min_sea_level_pressures( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_stages.py | 553 | def convert_ibtracs_to_gridded_data( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 183 | def _single_row_dataframe_from_dict(row_dict: Dict[str, Any]) -> pd.DataFrame: | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 187 | def _get_bounding_box_sides_in_degrees( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 237 | def _average_in_three_dimensions_and_project_on_sphere( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 428 | def _get_disc_windowed_gridded_probs_and_latlons( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 477 | def _get_mean_latlon_of_grid_points_within_disc( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 512 | def _get_mode_latlon_of_grid_points_within_disc( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 547 | def _get_is_in_radius_grid_around_latlon( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 635 | def _get_mean_scalar_variables_within_mask( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 696 | def _get_scalar_variables_via_bilinear_interpolation( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 720 | def _try_to_infer_probability_cyclone_exists_variable_name( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 742 | def _get_mean_cyclone_probability_within_mask( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 770 | def _get_cyclogenesis_candidates( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 845 | def _prune_and_refine_cyclogenesis_candidates( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 1076 | def _get_latlon_guess_with_momentum_update( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 1109 | def _advance_single_cyclone_active_at_lead_time_t( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 1290 | def _check_for_nans_in_predicted_tracks( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 1337 | def _get_cyclone_probability_of_existence_within_disc( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 1354 | def _get_all_scalar_variables_within_disc( | CODE |
| LOW | weathernext/cyclones/direct_tracker.py | 1369 | def _remove_nearby_cyclone_centers_based_on_which_moved_most( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 29 | def _get_ibtracs_quadrant_variable_tuples() -> ( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 199 | def filter_variables_for_reduced_dataset( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 212 | def get_cyclone_variable_names() -> List[str]: | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 306 | def create_global_lat_lon_grid_coordinates(resolution: float) -> np.ndarray: | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 326 | def create_sparse_nearest_neighbour_mask_from_latlon( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 368 | def create_gaussian_disc_mask_from_latlon( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 474 | def create_quadrant_integral_mask_from_latlons( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 580 | def create_disc_integral_mask_from_latlon( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 614 | def get_common_entries_without_nans( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 631 | def impute_quadrant_radii_nans( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 684 | def create_discs_centered_on_latlons( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 748 | def _create_wind_speed_linear_calibration_models( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 797 | def _linear_regression_with_clipping( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 851 | def create_wind_speed_calibration_and_aggregation_model( | CODE |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 877 | def compute_aggregated_wind_speeds( | CODE |
| LOW | weathernext/cyclones/cyclone_utils.py | 164 | def cartesian_spherical_geodesic_momentum_update( | CODE |
| LOW | weathernext/cyclones/cyclone_utils.py | 228 | def latlon_spherical_geodesic_momentum_update( | CODE |
| LOW | weathernext/weathernext1_graph/graphcast.py | 680 | def _inputs_to_grid_node_features( | CODE |
| LOW | weathernext/weathernext1_graph/graphcast.py | 701 | def _grid_node_outputs_to_prediction( | CODE |
| LOW | weathernext/utils/model_utils.py | 29 | def get_graph_spatial_features( | CODE |
| LOW | weathernext/utils/model_utils.py | 237 | def get_relative_position_in_receiver_local_coordinates( | CODE |
| LOW | weathernext/utils/model_utils.py | 322 | def get_rotation_matrices_to_local_coordinates( | CODE |
| 115 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | setup.py | 1 | # Copyright 2023 DeepMind Technologies Limited. | COMMENT |
| LOW | weathernext/__init__.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/cyclones/tracker_utils.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/cyclones/tracker_utils.py | 561 | # q_50_ne: 20 | COMMENT |
| LOW | weathernext/cyclones/tracker_utils.py | 661 | idx_sort, | COMMENT |
| LOW | weathernext/cyclones/ibtracs_netcdf_to_csv.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/cyclones/tracker_base.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/cyclones/data_pipeline_utils.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/cyclones/constants.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/cyclones/__init__.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/cyclones/ibtracs_processing_stages.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/cyclones/direct_tracker.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/cyclones/direct_tracker.py | 201 | # contain the pole, so the disc will contain the entire [0, 360] | COMMENT |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/cyclones/cyclone_utils.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/cyclones/direct_tracker_6h_v1_config.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/weathernext1_graph/__init__.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/weathernext1_graph/graphcast.py | 1 | # Copyright 2023 DeepMind Technologies Limited. | COMMENT |
| LOW | weathernext/utils/model_utils.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/model_utils.py | 301 | edge_rotation_matrices, node_pos[senders], np_=np_) | COMMENT |
| LOW | weathernext/utils/model_utils.py | 621 | receiver_pos_in_rotated_space = rotate_with_matrices( | COMMENT |
| LOW | weathernext/utils/update_blocks_utils.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/sharding.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/sharding.py | 21 | from jax.interpreters import pxla | COMMENT |
| LOW | weathernext/utils/task.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/autoregressive.py | 1 | # Copyright 2023 DeepMind Technologies Limited. | COMMENT |
| LOW | weathernext/utils/data_modalities.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/typed_graph.py | 1 | # Copyright 2023 DeepMind Technologies Limited. | COMMENT |
| LOW | weathernext/utils/typed_graph.py | 21 | _T = TypeVar('_T') | COMMENT |
| LOW | weathernext/utils/checkpoint.py | 1 | # Copyright 2023 DeepMind Technologies Limited. | COMMENT |
| LOW | weathernext/utils/xarray_dense.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/xarray_dense.py | 921 | # Transpose the array to put the preserved dims first, and the dims to split | COMMENT |
| LOW | weathernext/utils/sparse_transformer_utils.py | 1 | # Copyright 2024 DeepMind Technologies Limited. | COMMENT |
| LOW | weathernext/utils/solar_radiation.py | 1 | # Copyright 2023 DeepMind Technologies Limited. | COMMENT |
| LOW | weathernext/utils/solar_radiation.py | 201 | j2000_days: Timestamps represented as the number of days since the J2000 | COMMENT |
| LOW | weathernext/utils/dense.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/activations.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/mesh_transformer.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/variables.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/solar_radiation_test.py | 1 | # Copyright 2023 DeepMind Technologies Limited. | COMMENT |
| LOW | weathernext/utils/data_utils_test.py | 1 | # Copyright 2023 DeepMind Technologies Limited. | COMMENT |
| LOW | weathernext/utils/predictor_base.py | 1 | # Copyright 2023 DeepMind Technologies Limited. | COMMENT |
| LOW | weathernext/utils/fiddle_config_io.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/fiddle_config_io.py | 21 | from fiddle import daglish | COMMENT |
| LOW | weathernext/utils/fiddle_config_io.py | 41 | # "Index(index=0)", | COMMENT |
| LOW | weathernext/utils/fiddle_config_io.py | 61 | # | COMMENT |
| LOW | weathernext/utils/update_blocks.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/__init__.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/xarray_tree.py | 1 | # Copyright 2023 DeepMind Technologies Limited. | COMMENT |
| LOW | weathernext/utils/checkpoint_test.py | 1 | # Copyright 2023 DeepMind Technologies Limited. | COMMENT |
| LOW | weathernext/utils/deep_gnn.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/icosahedral_mesh.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/icosahedral_mesh.py | 201 | # (adjacent face)/ \ (adjacent face) ^ | COMMENT |
| LOW | weathernext/utils/icosahedral_mesh.py | 241 | # / \ | COMMENT |
| LOW | weathernext/utils/icosahedral_mesh.py | 281 | # / \ | COMMENT |
| LOW | weathernext/utils/typed_graph_net.py | 1 | # Copyright 2026 Google LLC. | COMMENT |
| LOW | weathernext/utils/typed_graph_net.py | 401 | graph.context.features, | COMMENT |
| LOW | weathernext/utils/xarray_tree_test.py | 1 | # Copyright 2023 DeepMind Technologies Limited. | COMMENT |
| LOW | weathernext/utils/casting.py | 1 | # Copyright 2023 DeepMind Technologies Limited. | COMMENT |
| LOW | weathernext/utils/data_utils.py | 1 | # Copyright 2023 DeepMind Technologies Limited. | COMMENT |
| 29 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | weathernext/cyclones/tracker_utils.py | 199 | Performs bilinear interpolation on gridded predictions at a given latlon. Args: gridded_predictions: gridded pred | STRING |
| HIGH | weathernext/cyclones/cyclone_utils.py | 169 | Calculates momentum update from pos_curr using pos_prev, on a sphere. Assumes pos_curr and pos_prev are on the unit s | STRING |
| HIGH | weathernext/utils/solar_radiation.py | 530 | Computes the solar radiation incident at the top of the atmosphere. This method is a wrapper for `get_toa_incident_so | STRING |
| HIGH | weathernext/utils/typed_graph_net.py | 211 | Returns a method that applies a configured GraphNetwork. This implementation follows Algorithm 1 in https://arxiv.org | STRING |
| HIGH | weathernext/utils/data_utils.py | 106 | Derives features used by ML models from the `progress` variable. Args: name: Base variable name from which featur | STRING |
| HIGH | weathernext/utils/data_utils.py | 220 | Extracts inputs and targets for prediction, from a Dataset with a time dim. The input period is assumed to be contigu | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | weathernext/cyclones/tracker_utils.py | 352 | CODE | |
| LOW | weathernext/cyclones/ibtracs_netcdf_to_csv.py | 71 | CODE | |
| LOW | weathernext/cyclones/direct_tracker.py | 1598 | CODE | |
| LOW | weathernext/utils/checkpoint.py | 98 | CODE | |
| LOW | weathernext/utils/xarray_dense.py | 749 | CODE | |
| LOW | weathernext/utils/xarray_dense.py | 848 | CODE | |
| LOW | weathernext/utils/xarray_dense.py | 472 | CODE | |
| LOW | weathernext/utils/xarray_dense.py | 686 | CODE | |
| LOW | weathernext/utils/dense.py | 251 | CODE | |
| LOW | weathernext/utils/fiddle_config_io.py | 104 | CODE | |
| LOW | weathernext/utils/points_mesh_gnn.py | 415 | CODE | |
| LOW | weathernext/utils/sparse_transformer.py | 513 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | weathernext/utils/data_modalities.py | 374 | # We leverage `ShareLeadingAxesArrayTree` to guarantee that the arrays | COMMENT |
| MEDIUM | weathernext/utils/data_modalities.py | 494 | # We leverage `ShareLeadingAxesArrayTree` to guarantee that the arrays | COMMENT |
| MEDIUM | weathernext/utils/data_modalities.py | 723 | # We leverage `ShareLeadingAxesArrayTree` to guarantee that the arrays | COMMENT |
| LOW | weathernext/utils/data_modalities.py | 1374 | # No masking, just return the array, only possible if it is a static array. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | weathernext/utils/fiddle_config_io.py | 100 | except ValueError: | CODE |
| HIGH | weathernext/utils/xarray_tree.py | 62 | except ValueError: # Exact join not possible. | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | weathernext/cyclones/direct_tracker.py | 333 | CODE | |
| LOW | weathernext/cyclones/ibtracs_processing_utils.py | 365 | CODE | |
| LOW | weathernext/utils/dense.py | 251 | CODE | |
| LOW | weathernext/utils/deep_gnn.py | 65 | CODE | |
| LOW | weathernext/utils/typed_graph_net.py | 197 | CODE | |
| LOW | weathernext/utils/xarray_tree_test.py | 42 | CODE | |
| LOW | weathernext/utils/sparse_transformer.py | 513 | CODE | |
| LOW | weathernext/utils/legacy/deep_typed_graph_net.py | 82 | CODE | |
| LOW | weathernext/utils/legacy/deep_typed_graph_net.py | 281 | CODE | |
| LOW | weathernext/weathernext2/architecture.py | 53 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | weathernext/cyclones/ibtracs_processing_stages.py | 403 | # Create the actual wind gridded quadrant shape. | COMMENT |
| MEDIUM | weathernext/utils/icosahedral_mesh.py | 231 | # This class handles the positioning of the new vertices, and avoids creating | COMMENT |
| MEDIUM | weathernext/utils/icosahedral_mesh.py | 272 | # This class handles the positioning of the new vertices, and avoids creating | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | weathernext/cyclones/direct_tracker.py | 925 | # Check if the refined latlon has a probability of existence above the | COMMENT |
| LOW | weathernext/utils/gather_scatter_ops.py | 87 | # Check if all indices fall within the index_range. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | weathernext/utils/solar_radiation.py | 26 | CODE |