From f30a53b2425cc177e4bd2a7fc5f1f4741ac99385 Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 4 Nov 2026 12:43:11 +0100 Subject: [PATCH] A compose-candidate answer's open input keeps its numbers as written when decoded The answer's input is now the object the node-engine seat's contract names, so a decoder without UseNumber turns its numbers into float64 and a checker re-encoding it for the composer would hand on different digits. Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn --- go/delivery/compose_candidate.go | 1 + 1 file changed, 1 insertion(+) diff --git a/go/delivery/compose_candidate.go b/go/delivery/compose_candidate.go index 26f051d..2420d61 100644 --- a/go/delivery/compose_candidate.go +++ b/go/delivery/compose_candidate.go @@ -148,6 +148,7 @@ func checkComposeAnswer(a ComposeCandidateAnswer) error { func strictDecode(data []byte, v any, what string) error { d := json.NewDecoder(bytes.NewReader(data)) d.DisallowUnknownFields() + d.UseNumber() // a number in an object the contract leaves open (the composition input) keeps its digits as written if err := d.Decode(v); err != nil { return fmt.Errorf("delivery: %s does not fit its shape: %w", what, err) }