Part of epic tracebloc/backend#1106. Full spec: report §5 (mirrored on the epic; artifact https://claude.ai/code/artifact/b4b6e6a6-4d76-4e46-a668-6f4f0f944344). WS-B PR2 (the risky one): extract the two stanzas from the 586-line runDataIngest; KEEP the jsonEmitted/named-return defer dance in the function owning err. Safety net: #187 outcome-matrix table test + #264 mutation pins must pass untouched. Target: data.go <250, runDataIngest <150. Stacks on WS-B.1.
Part of epic tracebloc/backend#1106. Full spec: report §5 (mirrored on the epic; artifact https://claude.ai/code/artifact/b4b6e6a6-4d76-4e46-a668-6f4f0f944344). WS-B PR2 (the risky one): extract the two stanzas from the 586-line runDataIngest; KEEP the jsonEmitted/named-return defer dance in the function owning err. Safety net: #187 outcome-matrix table test + #264 mutation pins must pass untouched. Target: data.go <250, runDataIngest <150. Stacks on WS-B.1.