@@ -610,6 +610,8 @@ func summarizeMPIC(passed, failed []string, passedRIRSet map[string]struct{}) *m
610610// Internal logic errors are logged. If the number of operation failures exceeds
611611// va.maxRemoteFailures, the first encountered problem is returned as a
612612// *probs.ProblemDetails.
613+ //
614+ // It always returns a non-nil summary, whether or not there's also a prob.
613615func (va * ValidationAuthorityImpl ) doRemoteOperation (ctx context.Context , op remoteOperation , req proto.Message ) (* mpicSummary , * probs.ProblemDetails ) {
614616 remoteVACount := len (va .remoteVAs )
615617 // - Mar 15, 2026: MUST implement using at least 3 perspectives
@@ -618,7 +620,7 @@ func (va *ValidationAuthorityImpl) doRemoteOperation(ctx context.Context, op rem
618620 // See "Phased Implementation Timeline" in
619621 // https://github.com/cabforum/servercert/blob/main/docs/BR.md#3229-multi-perspective-issuance-corroboration
620622 if remoteVACount < 3 {
621- return nil , probs .ServerInternal ("Insufficient remote perspectives: need at least 3" )
623+ return summarizeMPIC ( nil , nil , nil ) , probs .ServerInternal ("Insufficient remote perspectives: need at least 3" )
622624 }
623625
624626 type response struct {
@@ -883,7 +885,12 @@ func (va *ValidationAuthorityImpl) DoDCV(ctx context.Context, req *vapb.PerformV
883885 }
884886 var summary * mpicSummary
885887 summary , prob = va .doRemoteOperation (ctx , op , req )
886- logAttrs = append (logAttrs , slog .Any ("mpicSummary" , summary ))
888+ logAttrs = append (logAttrs , slog .Group ("mpic" ,
889+ slog .Any ("passed" , summary .Passed ),
890+ slog .Any ("failed" , summary .Failed ),
891+ slog .Any ("passedRIRs" , summary .PassedRIRs ),
892+ slog .String ("quorum" , summary .QuorumResult ),
893+ ))
887894 }
888895
889896 return bgrpc .ValidationResultToPB (records , filterProblemDetails (prob ), va .perspective , va .rir )
0 commit comments