# GrowNet API Diff — Python ↔ Mojo

**Divergence score:** 92.31%  

Totals: python_public=193, mojo_public=115, union=234, missing_in_mojo=119, missing_in_python=41, arity_mismatches=56


## Missing in Mojo (present in Python)

- `adaptive` (function, arity=0)
- `clamp` (function, arity=3)
- `compat_bound_delivered_count` (function, arity=0)
- `connect_layers_topographic` (function, arity=4)
- `download_once` (function, arity=0)
- `fixed` (function, arity=1)
- `get_first_neuron` (function, arity=2)
- `get_incoming_weight_sums` (function, arity=3)
- `get_topographic_weights` (function, arity=3)
- `is_trainable_layer` (function, arity=1)
- `last_slot_of` (function, arity=1)
- `load_image` (function, arity=1)
- `log_fire` (function, arity=2)
- `main` (function, arity=0)
- `make_neuron_at_capacity` (function, arity=1)
- `make_region_for_growth` (function, arity=0)
- `math_ceil` (function, arity=1)
- `maybe_grow` (function, arity=2)
- `mk_region_for_growth` (function, arity=0)
- `nonuniform` (function, arity=1)
- `omniglot_batches` (function, arity=3)
- `run` (function, arity=0)
- `run_demo` (function, arity=0)
- `run_few_shot` (function, arity=7)
- `smooth_clamp` (function, arity=4)
- `test_autowire_inbound_mesh_and_tracts_do_not_crash` (function, arity=0)
- `test_connect_and_prune_synapse` (function, arity=0)
- `test_connect_layers_full_mesh` (function, arity=0)
- `test_connect_layers_windowed_returns_unique_subscriptions` (function, arity=0)
- `test_defaults_preserve_behaviour` (function, arity=0)
- `test_determinism_two_runs_identical` (function, arity=0)
- `test_dog_non_negative_and_shape` (function, arity=0)
- `test_feedback_edge_smoke` (function, arity=0)
- `test_frozen_slot_scalar_stops_adaptation_and_unfreeze_resumes` (function, arity=0)
- `test_frozen_slot_spatial_2d_stops_adaptation_and_unfreeze_resumes` (function, arity=0)
- `test_gaussian_monotonic_with_distance` (function, arity=0)
- `test_hd_image_retina_single_tick_timing` (function, arity=0)
- `test_hd_image_single_tick_timing` (function, arity=0)
- `test_image_input_event_count` (function, arity=0)
- `test_lateral_bus_decay_semantics` (function, arity=0)
- `test_min_delta_gate_blocks_small_deltas` (function, arity=0)
- `test_multi_layer_input_binding` (function, arity=1)
- `test_neuron_growth_on_fallback` (function, arity=0)
- `test_proximity_policy_budget_respected_step_mode` (function, arity=0)
- `test_proximity_policy_disabled_returns_zero` (function, arity=0)
- `test_pulse_checks` (function, arity=0)
- `test_region_adds_layer_under_pressure` (function, arity=0)
- `test_region_grows_at_most_one_layer_per_tick_and_tracks_step` (function, arity=0)
- `test_same_missing_slot_guard_blocks_alternation` (function, arity=0)
- `test_scalar_neuron_growth_on_fallback_strict_capacity` (function, arity=0)
- `test_single_tick_no_tracts` (function, arity=0)
- `test_sink_map_dedup_for_output_layer` (function, arity=0)
- `test_slot_assignment_sequence` (function, arity=0)
- `test_slot_creation_bins_by_percent_delta` (function, arity=0)
- `test_spatial_metrics_centroid_and_bbox` (function, arity=1)
- `test_spatial_slotting_first_anchor_and_bins` (function, arity=0)
- `test_temporal_focus_creates_many_slots` (function, arity=0)
- `test_unique_source_return_parity_and_normalization` (function, arity=0)
- `AdaptivePercentPolicy.compute_slot_id` (method, arity=2)
- `AdaptivePercentPolicy.note_slot_use` (method, arity=2)
- `FixedPercentPolicy.compute_slot_id` (method, arity=2)
- `InhibitoryNeuron.fire` (method, arity=1)
- `InputNeuron.on_input` (method, arity=1)
- `InputNeuron.on_output` (method, arity=1)
- `LateralBus.get_inhibition_decay` (method, arity=0)
- `LateralBus.get_inhibition_factor` (method, arity=0)
- `LateralBus.get_modulation_factor` (method, arity=0)
- `LateralBus.set_inhibition` (method, arity=1)
- `LateralBus.set_modulation` (method, arity=1)
- `Layer.wire_random_feedback` (method, arity=1)
- `Layer.wire_random_feedforward` (method, arity=1)
- `ModulatoryNeuron.fire` (method, arity=1)
- `Neuron.end_tick` (method, arity=0)
- `Neuron.fire` (method, arity=1)
- `Neuron.fired_last` (method, arity=0)
- `Neuron.get_bus` (method, arity=0)
- `Neuron.get_last_input_value` (method, arity=0)
- `Neuron.get_outgoing` (method, arity=0)
- `Neuron.has_last_input` (method, arity=0)
- `Neuron.id` (method, arity=0)
- `Neuron.maybe_request_neuron_growth` (method, arity=0)
- `Neuron.prune_synapses` (method, arity=2)
- `Neuron.register_fire_hook` (method, arity=1)
- `Neuron.set_bus` (method, arity=1)
- `Neuron.set_fired_last` (method, arity=1)
- `Neuron.set_last_input_value` (method, arity=1)
- `NonUniformPercentPolicy.compute_slot_id` (method, arity=2)
- `OutputNeuron.end_tick` (method, arity=0)
- `OutputNeuron.get_outgoing` (method, arity=0)
- `OutputNeuron.get_output_value` (method, arity=0)
- `OutputNeuron.get_slots` (method, arity=0)
- `OutputNeuron.on_input` (method, arity=1)
- `OutputNeuron.on_output` (method, arity=1)
- `Region.autowire_new_neuron` (method, arity=2)
- `Region.compute_spatial_metrics` (method, arity=2)
- `Region.prune` (method, arity=2)
- `Region.pulse_inhibition` (method, arity=1)
- `Region.pulse_modulation` (method, arity=1)
- `RegionBus.get_inhibition_decay` (method, arity=0)
- `RegionBus.get_inhibition_factor` (method, arity=0)
- `RegionBus.get_modulation_factor` (method, arity=0)
- `RegionBus.set_inhibition` (method, arity=1)
- `RegionBus.set_modulation` (method, arity=1)
- `SlotPolicy.compute_slot_id` (method, arity=2)
- `Synapse.get_last_seen_tick` (method, arity=0)
- `Synapse.get_strength_value` (method, arity=0)
- `Synapse.set_last_seen_tick` (method, arity=1)
- `Synapse.set_strength_value` (method, arity=1)
- `Tract.on_source_fired` (method, arity=2)
- `Weight.get_hit_count` (method, arity=0)
- `Weight.get_last_touched` (method, arity=0)
- `Weight.get_strength_value` (method, arity=0)
- `Weight.get_threshold_value` (method, arity=0)
- `Weight.is_first_seen` (method, arity=0)
- `Weight.mark_touched` (method, arity=1)
- `Weight.set_first_seen` (method, arity=1)
- `Weight.set_hit_count` (method, arity=1)
- `Weight.set_strength_value` (method, arity=1)
- `Weight.set_threshold_value` (method, arity=1)

## Missing in Python (present in Mojo)

- `ExcitatoryNeuron.init` (method, arity=3)
- `ExcitatoryNeuron.on_input` (method, arity=2)
- `ExcitatoryNeuron.on_output` (method, arity=2)
- `GrowthPolicy.init` (method, arity=7)
- `InhibitoryNeuron.init` (method, arity=3)
- `InhibitoryNeuron.on_input` (method, arity=2)
- `InhibitoryNeuron.on_output` (method, arity=2)
- `InputLayer2D.get_bus` (method, arity=0)
- `InputLayer2D.get_neurons` (method, arity=0)
- `InputLayer2D.init` (method, arity=5)
- `InputLayerND.init` (method, arity=4)
- `Layer.init` (method, arity=4)
- `MathUtils.abs_f64` (method, arity=1)
- `MathUtils.lerp` (method, arity=3)
- `MathUtils.smooth_clamp` (method, arity=3)
- `ModulatoryNeuron.init` (method, arity=3)
- `ModulatoryNeuron.on_input` (method, arity=2)
- `ModulatoryNeuron.on_output` (method, arity=2)
- `Neuron.init` (method, arity=3)
- `OutputLayer2D.forward` (method, arity=2)
- `OutputLayer2D.get_bus` (method, arity=0)
- `OutputLayer2D.get_neurons` (method, arity=0)
- `OutputLayer2D.init` (method, arity=4)
- `ProximityConfig.init` (method, arity=1)
- `ProximityEngine.init` (method, arity=1)
- `Region.autowire_new_neuron_by_ref` (method, arity=3)
- `Region.init` (method, arity=2)
- `Region.rand_f64` (method, arity=1)
- `Region.tick_nd` (method, arity=4)
- `RegionBus.reset` (method, arity=1)
- `RegionMetrics.get_delivered_events` (method, arity=0)
- `RegionMetrics.get_total_slots` (method, arity=0)
- `RegionMetrics.get_total_synapses` (method, arity=0)
- `SlotEngine.select_anchor_slot_id` (method, arity=4)
- `SpatialHash.init` (method, arity=2)
- `Synapse.init` (method, arity=3)
- `TestRunner.drive_tick_with_uniform_frame` (method, arity=5)
- `TestRunner.expect_true` (method, arity=2)
- `TestRunner.test_region_growth_or_trigger_single_growth` (method, arity=0)
- `TopographicConfig.connect_layers_topographic` (method, arity=4)
- `Tract.init` (method, arity=13)

## Arity mismatches (same name, different param counts)

- `DeterministicLayout.position`: Python=4, Mojo=7
- `InputLayer2D.forward_image`: Python=1, Mojo=2
- `InputLayer2D.propagate_from`: Python=2, Mojo=3
- `InputLayerND.forward_nd`: Python=2, Mojo=3
- `InputLayerND.propagate_from`: Python=2, Mojo=3
- `LateralBus.decay`: Python=0, Mojo=1
- `LateralBus.set_inhibition_factor`: Python=1, Mojo=2
- `LateralBus.set_modulation_factor`: Python=1, Mojo=2
- `Layer.end_tick`: Python=0, Mojo=1
- `Layer.forward`: Python=1, Mojo=2
- `Layer.propagate_from`: Python=2, Mojo=3
- `Layer.propagate_from_2d`: Python=4, Mojo=5
- `Layer.set_region`: Python=1, Mojo=2
- `Layer.try_grow_neuron`: Python=1, Mojo=2
- `Neuron.freeze_last_slot`: Python=0, Mojo=1
- `Neuron.on_input`: Python=1, Mojo=2
- `Neuron.on_input_2d`: Python=3, Mojo=4
- `Neuron.on_output`: Python=1, Mojo=2
- `Neuron.unfreeze_last_slot`: Python=0, Mojo=1
- `OutputLayer2D.end_tick`: Python=0, Mojo=1
- `OutputLayer2D.propagate_from`: Python=2, Mojo=3
- `ProximityEngine.apply`: Python=1, Mojo=3
- `Region.add_input_layer_2d`: Python=4, Mojo=5
- `Region.add_input_layer_nd`: Python=3, Mojo=4
- `Region.add_layer`: Python=3, Mojo=4
- `Region.add_output_layer_2d`: Python=3, Mojo=4
- `Region.bind_input`: Python=2, Mojo=3
- `Region.bind_input_2d`: Python=6, Mojo=7
- `Region.bind_input_nd`: Python=5, Mojo=6
- `Region.bind_output`: Python=2, Mojo=3
- `Region.connect_layers`: Python=4, Mojo=5
- `Region.connect_layers_windowed`: Python=8, Mojo=9
- `Region.ensure_input_edge`: Python=1, Mojo=2
- `Region.ensure_output_edge`: Python=1, Mojo=2
- `Region.request_layer_growth`: Python=1, Mojo=3
- `Region.set_growth_policy`: Python=1, Mojo=2
- `Region.tick`: Python=2, Mojo=3
- `Region.tick_2d`: Python=2, Mojo=3
- `Region.tick_image`: Python=2, Mojo=3
- `RegionBus.decay`: Python=0, Mojo=1
- `RegionBus.set_inhibition_factor`: Python=1, Mojo=2
- `RegionBus.set_modulation_factor`: Python=1, Mojo=2
- `RegionMetrics.add_slots`: Python=1, Mojo=2
- `RegionMetrics.add_synapses`: Python=1, Mojo=2
- `RegionMetrics.inc_delivered_events`: Python=1, Mojo=2
- `RegionMetrics.set_bbox`: Python=4, Mojo=5
- `SlotEngine.select_or_create_slot`: Python=3, Mojo=2
- `SlotEngine.slot_id_2d`: Python=2, Mojo=8
- `SpatialHash.insert`: Python=2, Mojo=6
- `SpatialHash.key_for_position`: Python=1, Mojo=5
- `SpatialHash.near`: Python=1, Mojo=3
- `Tract.attach_source_neuron`: Python=1, Mojo=3
- `Weight.freeze`: Python=0, Mojo=1
- `Weight.reinforce`: Python=1, Mojo=2
- `Weight.unfreeze`: Python=0, Mojo=1
- `Weight.update_threshold`: Python=5, Mojo=2

---
_This report compares public snake_case symbols (no leading underscores). Contract projection is heuristic if the YAML does not expose per-language sections explicitly._

