{"record":{"id":"fa69bb40f0c94293","repo":"hyperledger/fabric","slug":"no-proposal-responses-received-this-might-indica","errorCode":null,"errorMessage":"no proposal responses received - this might indicate a bug","messagePattern":"no proposal responses received - this might indicate a bug","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/peer/chaincode/common.go","lineNumber":530,"sourceCode":"\n\tprop, txid, err := protoutil.CreateChaincodeProposalWithTxIDAndTransient(pcommon.HeaderType_ENDORSER_TRANSACTION, cID, invocation, creator, txID, tMap)\n\tif err != nil {\n\t\treturn nil, errors.WithMessagef(err, \"error creating proposal for %s\", funcName)\n\t}\n\n\tsignedProp, err := protoutil.GetSignedProposal(prop, signer)\n\tif err != nil {\n\t\treturn nil, errors.WithMessagef(err, \"error creating signed proposal for %s\", funcName)\n\t}\n\n\tresponses, err := processProposals(endorserClients, signedProp)\n\tif err != nil {\n\t\treturn nil, errors.WithMessagef(err, \"error endorsing %s\", funcName)\n\t}\n\n\tif len(responses) == 0 {\n\t\t// this should only happen if some new code has introduced a bug\n\t\treturn nil, errors.New(\"no proposal responses received - this might indicate a bug\")\n\t}\n\t// all responses will be checked when the signed transaction is created.\n\t// for now, just set this so we check the first response's status\n\tproposalResp := responses[0]\n\n\tif invoke {\n\t\tif proposalResp != nil {\n\t\t\tif proposalResp.Response.Status >= shim.ERRORTHRESHOLD {\n\t\t\t\treturn proposalResp, nil\n\t\t\t}\n\t\t\t// assemble a signed transaction (it's an Envelope message)\n\t\t\tenv, err := protoutil.CreateSignedTx(prop, signer, responses...)\n\t\t\tif err != nil {\n\t\t\t\treturn proposalResp, errors.WithMessage(err, \"could not assemble transaction\")\n\t\t\t}\n\t\t\tvar dg *DeliverGroup\n\t\t\tvar ctx context.Context\n\t\t\tif waitForEvent {","sourceCodeStart":512,"sourceCodeEnd":548,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/internal/peer/chaincode/common.go#L512-L548","documentation":"After endorsing the proposal, ChaincodeInvokeOrQuery expects at least one ProposalResponse. An empty slice means the endorsing path returned success with no responses, which the code treats as impossible outside of a bug — hence the message.","triggerScenarios":"processProposals/endorser call returns (nil error, empty responses) — typically when the endorser client stub or hook was overridden and returns an empty reply, or new endorser-handling code silently drops all responses.","commonSituations":"Test harnesses stubbing GetEndorserClientFnc/processProposals; custom middleware wrapping the endorser that filters responses; Fabric regressions after upgrades.","solutions":["Check for overrides of the endorser client or processProposals in your build/tests and restore defaults","Inspect endorser logs to confirm proposals were actually processed","Upgrade Fabric if reproducible with stock CLI — it indicates an internal bug; report with repro steps"],"exampleFix":"// before (stubbed endorser returning empty)\nmockEndorser.ProcessProposal = func(...) (*pb.ProposalResponse, error) { return &pb.ProposalResponse{}, nil }\n// after\nmockEndorser.ProcessProposal = func(...) (*pb.ProposalResponse, error) { return validEndorsementResponse, nil }","handlingStrategy":"try-catch","validationCode":"if endorserClient == nil {\n    return fmt.Errorf(\"endorser client must be initialized before invoking\")\n}","typeGuard":"func hasResponses(resps []*pb.ProposalResponse) bool { return len(resps) > 0 }","tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"no proposal responses received\") {\n    // treat as internal bug: dump endorser config + override state, escalate\n    logger.Errorf(\"endorser returned zero responses; check GetEndorserClientFnc/processProposals overrides\")\n}","preventionTips":["Do not stub endorser clients in production builds","Keep Fabric binaries on a supported release","Log processProposals results when wrapping the endorser"],"tags":["fabric","endorser","internal-bug","proposal-response"],"backgroundTag":"no-proposal-responses","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}