4e2152b2

By: Michael Lynch <git@mtlynch.io>

Validate grocery sections with typed values

Add a Section type that trims leading and trailing whitespace and rejects empty section names. Move section-bearing handler and store APIs to use typed section values, converting to raw strings only at user-input, rendering, and SQLite boundaries.

Add a SQLite migration that trims legacy section names across grocery items, item-section mappings, stored list items, and section ordering. The migration rebuilds section_ordering through a temporary table keyed by the trimmed name so entries that collide after trimming collapse to the earliest sort order.

Testing:
- ./dev-scripts/run-go-tests
- ./dev-scripts/git-hooks/pre-commit
- nix flake check

Suite timing

Time to Start Worker time Duration Time to finish
Config 2s 8s 8s 11s
Eval 8s 1m23s 1m23s 1m32s
Build 28s 12m12s 19m13s 19m41s
Suite 2s 13m44s 19m39s 19m41s

Timeline

0s10s20s30s40s50s1m1m10s1m20s1m30s1m40s1m50s2m2m10s2m20s