Port the five audit-unmatched helpers name-preserving into the Go crate
(gaps.go): _utc_now_iso (Python isoformat law — six-digit fraction iff
nonzero, injectable clock seam pinned by the battery to the frozen
oracle instants), _contains_tool_object_key (name-preserving twin of
the outside-strings scanner), to_ollama_tools (registry → Ollama
function shape), dispatch_validated_tool (validate-before-dispatch with
an Executor seam; invalid calls provably never reach the executor),
tool_requires_approval (fail-closed against the 12-name READ_ONLY
frozenset; NOT derived from registry risk — lint_file runs a linter).
Truth 17→32 cases (utc both instants, 8 scanner cases, full-registry
ollama conversion, dispatch alias/invalid, approval verdict for every
registered tool + alias + unknown with schema-valid minimal args);
regen x2 identical modulo the pre-existing uuid call_id quirk.
DEFECT FOUND+FIXED: the landed containsToolObjectKey reused ONE
json.Decoder across candidates (wrong offsets after the first decode)
and dropped the oracle's colon check — the new frozen true-positive
cases exposed it; rewritten to the oracle's per-candidate raw-decode +
colon law (fix-first, proof = battery green). go test/vet/gofmt/build
clean; pytest 60+29 subtests both pins. tool_protocol 22/27 → 27/27
fn-level.