NoticeTextSections()NamedTupleThe three user-controlled text sections a goal-state notice can embed.
Named rather than a bare tuple[str | None, str | None, str | None]: all five
call sites unpack positionally and immediately re-pass the parts as keyword
arguments to validate_goal_notice_text, where swapping two of them
type-checks cleanly and would validate the wrong text against the wrong
budget. Tuple unpacking still works, so the field names cost nothing.