{"record":{"id":"88ae2d9f48cbf09b","repo":"hyperledger/fabric","slug":"current-config-has-application-section-but-new-co","errorCode":null,"errorMessage":"current config has application section, but new config does not","messagePattern":"current config has application section, but new config does not","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"common/channelconfig/bundle.go","lineNumber":122,"sourceCode":"\t\t\t}\n\t\t}\n\n\t\tfor orgName, org := range oc.Organizations() {\n\t\t\tnorg, ok := noc.Organizations()[orgName]\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tmspID := org.MSPID()\n\t\t\tif mspID != norg.MSPID() {\n\t\t\t\treturn errors.Errorf(\"orderer org %s attempted to change MSP ID from %s to %s\", orgName, mspID, norg.MSPID())\n\t\t\t}\n\t\t}\n\t}\n\n\tif ac, ok := b.ApplicationConfig(); ok {\n\t\tnac, ok := nb.ApplicationConfig()\n\t\tif !ok {\n\t\t\treturn errors.New(\"current config has application section, but new config does not\")\n\t\t}\n\n\t\tfor orgName, org := range ac.Organizations() {\n\t\t\tnorg, ok := nac.Organizations()[orgName]\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tmspID := org.MSPID()\n\t\t\tif mspID != norg.MSPID() {\n\t\t\t\treturn errors.Errorf(\"application org %s attempted to change MSP ID from %s to %s\", orgName, mspID, norg.MSPID())\n\t\t\t}\n\t\t}\n\t}\n\n\tif cc, ok := b.ConsortiumsConfig(); ok {\n\t\tncc, ok := nb.ConsortiumsConfig()\n\t\tif !ok {\n\t\t\treturn errors.Errorf(\"current config has consortiums section, but new config does not\")","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/common/channelconfig/bundle.go#L104-L140","documentation":"This error is thrown by ValidateNew in common/channelconfig/bundle.go when a channel config update removes the Application section from a channel that currently has one. The library requires that if the current bundle has an ApplicationConfig, the proposed bundle must also have one; application sections cannot be dropped via a standard config update. It is a structural guard against accidentally deleting the application group from a channel config.","triggerScenarios":"Submitting a config update computed from a modified config where the Application group (channel->groups->Application) was deleted, e.g. by regenerating the config without Application section, or a configtxlator round-trip that dropped the Application group from the update transaction.","commonSituations":"Creating an update payload from a system-channel or orderer-only config template that lacks an Application group; running configtxlator proto_decode -> edit -> proto_encode and accidentally removing the Application group; generating a new channel creation config from a profile without Application (an orderer-only profile) and trying to apply it to an application channel.","solutions":["Ensure the proposed config update retains the channel->groups->Application group from the current config; only modify values inside it.","Re-generate the update payload with configtxlator: diff current_config.json against properly edited updated_config.json that still contains the Application group.","If the channel genuinely should have no application section, that requires re-creating the channel, not a config update — plan accordingly.","Verify the configtx profile used to generate the config includes an Application section for application channels."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Ensure an update to an application channel keeps the Application group\nfunc requireApplicationGroup(current, proposed *cb.Config) error {\n\tif _, ok := current.Groups[\"Application\"]; ok {\n\t\tif _, ok := proposed.Groups[\"Application\"]; !ok {\n\t\t\treturn errors.New(\"proposed config drops the Application group\")\n\t\t}\n\t}\n\treturn nil\n}","typeGuard":null,"tryCatchPattern":"if err := configtxManager.ProposeConfigUpdate(env); err != nil {\n\tif strings.Contains(err.Error(), \"application section\") {\n\t\t// regenerate the update from a base config that includes Application\n\t\treturn fmt.Errorf(\"structural config error: %w\", err)\n\t}\n\treturn err\n}","preventionTips":["Build config updates by editing a decoded copy of the CURRENT channel config, never from a fresh template","Always compute updates via configtxlator compute-update between two full configs","For application channels use configtx profiles that include an Application section","Sanity-check that all top-level groups present in the current config survive into the update"],"tags":["hyperledger-fabric","channel-config","config-update"],"backgroundTag":"missing-config-section","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"}