Get the optimized inspector route for a given day. Thin wrapper around person_b.plan_routes(); supports N-restaurant picks or pinned CAMIS lists.
Return an optimized inspector route. The actual VRP is solved by
person_b/03_cuopt_routing.py:plan_routes() (cuOpt when available,
greedy fallback otherwise). This skill is the agent-facing interface.
One of:
n_restaurants + n_inspectors — "plan a day visiting 40 from the
priority queue, across 5 inspectors"camis_list + n_inspectors — pin specific restaurants (e.g. the
inspector hand-picked 6 follow-ups)inspector (filter existing inspector_routes.json to one inspector)camis_list or n_restaurants is given, call
plan_routes(n_restaurants=..., n_inspectors=..., camis_list=...)
from person_b/03_cuopt_routing.py. This re-solves and overwrites
inspector_routes.json.data/processed/inspector_routes.jsoninspector filter is given, return only that inspector's legstatus of each outstanding
violation from violation_history.parquet so the inspector sees
what's waiting for them at every stop{
"solver": "cuOpt",
"solve_time_s": 0.42,
"pool_size": 40,
"n_inspectors": 5,
"total_stops_assigned": 38,
"total_travel_time_min": 184.2,
"inspectors": [
{
"inspector": "Inspector A",
"stop_count": 8,
"estimated_hours": 6.4,
"stops": [
{
"stop_number": 1,
"camis": 40012345,
"dba": "Chen's Kitchen",
"latitude": 40.8612,
"longitude": -73.8916,
"zipcode": "10458",
"arrival_time": "9:12",
"service_time_min": 20,
"priority_score": 0.82,
"grade_pending": true,
"letter_grade": null,
"label": "repeat_offender",
"violations_awaiting_review": [
{"code": "04L", "status": "soft_approved", "confidence": 0.84},
{"code": "06C", "status": "evidence_submitted", "confidence": 0.28}
]
}
]
}
]
}
person_a/05_route_features.py. This skill does not re-rank.camis_list to re-solve.