from __future__ import annotations
from collections import defaultdict

def execute(payload: dict) -> dict:
    cell = float(payload.get("cell_size_m", 1))
    minimum = int(payload.get("min_points", 2))
    if cell <= 0:
        raise ValueError("cell_size_m must be positive")
    buckets = defaultdict(list)
    for point in payload.get("points", []):
        buckets[(int(point[0] // cell), int(point[1] // cell))].append(point)
    obstacles = []
    for key, points in buckets.items():
        if len(points) < minimum:
            continue
        obstacles.append({"cell": list(key), "centroid": [round(sum(p[i] for p in points)/len(points), 3) for i in range(3)], "point_count": len(points), "class": "unknown_obstacle"})
    return {"frame": "lidar", "obstacles": obstacles, "obstacle_count": len(obstacles)}
