52e5e7c034
The create-path coercion (salvaged from #78928) left update_job and the cronjob tool's update handler comparing/storing raw strings: repeat= 'forever' via update raised TypeError in the tool path and stored the raw string via update_job, breaking the next mark_job_run ('str' has no .get). Extract normalize_repeat_value as the shared chokepoint (shape from #77366 by @andrexibiza, with garbage-rejection semantics) and route create_job, update_job, and the tool update handler through it. Completed counters are preserved across repeat updates. Class: #66824 #64520 #7142 #71987 #95706, update half of #77366.