From 5f3a4d20673974be499a968243d10dd26679d3ef Mon Sep 17 00:00:00 2001 From: pbatko-da Date: Thu, 25 Nov 2021 13:46:12 +0100 Subject: [PATCH] [Self-service error codes] Fix section numbering in pdf for error codes section by moving it a level higher. (#11867) Also make section header markers consistent docs' reamde. CHANGELOG_BEGIN CHANGELOG_END --- docs/source/app-dev/grpc/error-codes.rst | 44 +++++++++---------- docs/source/app-dev/grpc/index.rst | 6 --- ...tatus-codes-migration-table-ledger-api.rst | 36 +++++++-------- docs/source/app-dev/ledger-api.rst | 1 + .../app/ErrorCodeInventoryDocsGenApp.scala | 4 +- ...viceErrorCodes_MigrationGuideGen_App.scala | 6 +-- 6 files changed, 46 insertions(+), 51 deletions(-) diff --git a/docs/source/app-dev/grpc/error-codes.rst b/docs/source/app-dev/grpc/error-codes.rst index 54e7d5dfb113..914e67f6e271 100644 --- a/docs/source/app-dev/grpc/error-codes.rst +++ b/docs/source/app-dev/grpc/error-codes.rst @@ -34,7 +34,7 @@ The goal is to enable users, developers and operators to act on the encountered errors in a self-service manner, either in an automated-way or manually. Configuration -------------- +====================================== The new error code formats and adapted gRPC response statuses are returned by default starting with the Daml 1.18 SDK release. Clients can still migrate to Daml SDK 1.18 and use the pre-1.18 gRPC status code response behavior by using ``--use-pre-1.18-error-codes`` @@ -42,7 +42,7 @@ as a command line option. However, this option is deprecated and will be removed Glossary ---------------------------- +====================================== Error Represents an occurrence of a failure. @@ -82,14 +82,14 @@ Correlation id Error Categories ---------------------------- +====================================== The error categories allow to group errors such that application logic can be built in a sensible way to automatically deal with errors and decide whether to retry a request or escalate to the operator. TransientServerFailure -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ **Category id**: 1 **gRPC status code**: UNAVAILABLE @@ -104,7 +104,7 @@ TransientServerFailure ContentionOnSharedResources -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ **Category id**: 2 **gRPC status code**: ABORTED @@ -119,7 +119,7 @@ ContentionOnSharedResources DeadlineExceededRequestStateUnknown -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ **Category id**: 3 **gRPC status code**: DEADLINE_EXCEEDED @@ -134,7 +134,7 @@ DeadlineExceededRequestStateUnknown SystemInternalAssumptionViolated -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ **Category id**: 4 **gRPC status code**: INTERNAL @@ -149,7 +149,7 @@ SystemInternalAssumptionViolated MaliciousOrFaultyBehaviour -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ **Category id**: 5 **gRPC status code**: UNKNOWN @@ -164,7 +164,7 @@ MaliciousOrFaultyBehaviour AuthInterceptorInvalidAuthenticationCredentials -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ **Category id**: 6 **gRPC status code**: UNAUTHENTICATED @@ -179,7 +179,7 @@ AuthInterceptorInvalidAuthenticationCredentials InsufficientPermission -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ **Category id**: 7 **gRPC status code**: PERMISSION_DENIED @@ -194,7 +194,7 @@ InsufficientPermission InvalidIndependentOfSystemState -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ **Category id**: 8 **gRPC status code**: INVALID_ARGUMENT @@ -209,7 +209,7 @@ InvalidIndependentOfSystemState InvalidGivenCurrentSystemStateOther -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ **Category id**: 9 **gRPC status code**: FAILED_PRECONDITION @@ -224,7 +224,7 @@ InvalidGivenCurrentSystemStateOther InvalidGivenCurrentSystemStateResourceExists -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ **Category id**: 10 **gRPC status code**: ALREADY_EXISTS @@ -239,7 +239,7 @@ InvalidGivenCurrentSystemStateResourceExists InvalidGivenCurrentSystemStateResourceMissing -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ **Category id**: 11 **gRPC status code**: NOT_FOUND @@ -254,7 +254,7 @@ InvalidGivenCurrentSystemStateResourceMissing InvalidGivenCurrentSystemStateSeekAfterEnd -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ **Category id**: 12 **gRPC status code**: OUT_OF_RANGE @@ -269,7 +269,7 @@ InvalidGivenCurrentSystemStateSeekAfterEnd BackgroundProcessDegradationWarning -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ **Category id**: 13 **gRPC status code**: N/A @@ -286,7 +286,7 @@ BackgroundProcessDegradationWarning Anatomy of an Error ---------------------------- +====================================== Errors returned to users contain a `gRPC status code`_, a description and additional machine readable information @@ -294,7 +294,7 @@ represented in the `rich gRPC error model`_. Error Description -^^^^^^^^^^^^^^^^^^^ +-------------------------------------- We use the `standard gRPC description`_ that additionally adheres to our custom message format: @@ -330,7 +330,7 @@ In a concrete example an error description might look like this: Additional Machine Readable Information -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +---------------------------------------------------------------------------- We use following error details: @@ -369,7 +369,7 @@ The table below outlines all the cases and error conditions when a Ledger API se gRPC status code in comparison to the pre-1.18 releases. Common Ledger API changes ---------------------------- +====================================== The table below outlines generic gRPC status code changes pertaining to the Ledger API and apply to all ledger backends. For changes specific to a ledger backend, check the next subsections. @@ -379,7 +379,7 @@ and apply to all ledger backends. For changes specific to a ledger backend, chec .. include:: status-codes-migration-table-ledger-api.rst Sandbox (classic) ---------------------------- +====================================== The following gRPC status codes have changed for submission rejections in Sandbox classic. @@ -405,7 +405,7 @@ The following gRPC status codes have changed for submission rejections in Sandbo Daml Sandbox and VMBC ---------------------------- +====================================== The following gRPC status codes have changed for submission rejections in the Ledger API backed by KV-based ledgers (Daml Sandbox and VMBC). diff --git a/docs/source/app-dev/grpc/index.rst b/docs/source/app-dev/grpc/index.rst index 65641a37cd1b..231a29769c5b 100644 --- a/docs/source/app-dev/grpc/index.rst +++ b/docs/source/app-dev/grpc/index.rst @@ -95,9 +95,3 @@ INTERNAL, UNKNOWN (when returned by the Command Service) Aside from the standard gRPC status codes, the failures returned by the Ledger API are enriched with details meant to help the application or the application developer to handle the error autonomously (e.g. by retrying on a retryable error). For more details on the rich error details see the :doc:`error-codes` - - -.. toctree:: - :hidden: - - error-codes diff --git a/docs/source/app-dev/grpc/status-codes-migration-table-ledger-api.rst b/docs/source/app-dev/grpc/status-codes-migration-table-ledger-api.rst index a19b2deb1c79..5d70fada5c23 100644 --- a/docs/source/app-dev/grpc/status-codes-migration-table-ledger-api.rst +++ b/docs/source/app-dev/grpc/status-codes-migration-table-ledger-api.rst @@ -2,7 +2,7 @@ .. SPDX-License-Identifier: Apache-2.0 ActiveContractsService.getActiveContracts -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +------------------+--------------------+---------------------------------------------------------------------------------------------------------+---------------------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -15,7 +15,7 @@ ActiveContractsService.getActiveContracts CommandCompletionService.completionStream -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +------------------+--------------------+---------------------------------------------------------------------------------------------------------+---------------------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -28,7 +28,7 @@ CommandCompletionService.completionStream CommandService.submitAndWait -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +-------------------+------------------+------------------------------------------------------------------------------+-------------------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -49,7 +49,7 @@ CommandService.submitAndWait CommandService.submitAndWaitForTransaction -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +-------------------+------------------+------------------------------------------------------------------------------+-------------------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -70,7 +70,7 @@ CommandService.submitAndWaitForTransaction CommandService.submitAndWaitForTransactionId -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +-------------------+------------------+------------------------------------------------------------------------------+-------------------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -91,7 +91,7 @@ CommandService.submitAndWaitForTransactionId CommandService.submitAndWaitForTransactionTree -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +-------------------+------------------+------------------------------------------------------------------------------+-------------------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -112,7 +112,7 @@ CommandService.submitAndWaitForTransactionTree CommandSubmissionService.submit -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +------------------+-----------------+-------------------------------------------------------------------------+-------------------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -123,7 +123,7 @@ CommandSubmissionService.submit ConfigManagementService.setTimeModel -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +------------------+--------------------+----------------------------------------------------------------------------------+-------------------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -138,7 +138,7 @@ ConfigManagementService.setTimeModel GrpcHealthService.check -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +------------------+-----------------+----------------------------------------------------------------------------------------+-----------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -149,7 +149,7 @@ GrpcHealthService.check GrpcHealthService.watch -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +------------------+-----------------+----------------------------------------------------------------------------------------+-----------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -160,7 +160,7 @@ GrpcHealthService.watch PackageManagementService.uploadDarFile -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +------------------+--------------------+----------------------------------------------------------------------------+------------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -175,7 +175,7 @@ PackageManagementService.uploadDarFile ParticipantPruningService.prune -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +------------------+--------------------+-------------------------------------------------------------------------------------------------------+-----------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -190,7 +190,7 @@ ParticipantPruningService.prune PartyManagementService.allocateParty -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +------------------+------------------+-------------------------------------------------------------------+-----------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -201,7 +201,7 @@ PartyManagementService.allocateParty SubmissionService.submit -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +------------------+--------------------+-------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -236,7 +236,7 @@ SubmissionService.submit TransactionService.getFlatTransactionByEventId -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +------------------+-----------------+----------------------------------------------------------------------------------------+-------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -249,7 +249,7 @@ TransactionService.getFlatTransactionByEventId TransactionService.getTransactionByEventId -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +------------------+-----------------+----------------------------------------------------------------------------------------+----------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -264,7 +264,7 @@ TransactionService.getTransactionByEventId TransactionService.getTransactionTrees -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +------------------+--------------------+---------------------------------------------------------------------------------------------------------+---------------------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | @@ -283,7 +283,7 @@ TransactionService.getTransactionTrees TransactionService.getTransactions -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +------------------------------------------------------------------------------------------------------------------ +------------------+--------------------+---------------------------------------------------------------------------------------------------------+---------------------------------+ |gRPC status code |gRPC status code |Remarks |Ledger API | diff --git a/docs/source/app-dev/ledger-api.rst b/docs/source/app-dev/ledger-api.rst index 7d29f43e9701..ab24ea41268e 100644 --- a/docs/source/app-dev/ledger-api.rst +++ b/docs/source/app-dev/ledger-api.rst @@ -9,6 +9,7 @@ The Ledger API services grpc/index + grpc/error-codes grpc/proto-docs grpc/daml-to-ledger-api daml-lf-translation diff --git a/ledger/error/generator/app/src/main/scala/com/daml/error/generator/app/ErrorCodeInventoryDocsGenApp.scala b/ledger/error/generator/app/src/main/scala/com/daml/error/generator/app/ErrorCodeInventoryDocsGenApp.scala index f307956f793d..38cb631d74a9 100644 --- a/ledger/error/generator/app/src/main/scala/com/daml/error/generator/app/ErrorCodeInventoryDocsGenApp.scala +++ b/ledger/error/generator/app/src/main/scala/com/daml/error/generator/app/ErrorCodeInventoryDocsGenApp.scala @@ -150,7 +150,7 @@ object ErrorGroupTree { // Add group text textBuffer.addOne(s"""${groupHierarchicalIndex.mkString(".")}. ${newPath.mkString(" / ")} - |------------------------------------------------------------------------------------------------------------------- + |=================================================================================================================== | |${tree.explanation.getOrElse("")} |""".stripMargin) @@ -189,7 +189,7 @@ object ErrorGroupTree { | **Deprecation**: ${d} | """.stripMargin) s"""${e.code} - |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + |--------------------------------------------------------------------------------------------------------------------------------------- | $deprecationText | **Explanation**: ${e.explanation} | diff --git a/ledger/participant-integration-api/src/docs/scala/com/daml/platform/docs/SelfServiceErrorCodes_MigrationGuideGen_App.scala b/ledger/participant-integration-api/src/docs/scala/com/daml/platform/docs/SelfServiceErrorCodes_MigrationGuideGen_App.scala index 6eb6ddc015a1..6f0b895ac3ee 100644 --- a/ledger/participant-integration-api/src/docs/scala/com/daml/platform/docs/SelfServiceErrorCodes_MigrationGuideGen_App.scala +++ b/ledger/participant-integration-api/src/docs/scala/com/daml/platform/docs/SelfServiceErrorCodes_MigrationGuideGen_App.scala @@ -123,14 +123,14 @@ object SelfServiceErrorCodes_MigrationGuideGen_App { "(before SDK 1.18)", "gRPC status code\n" + "(since SDK 1.18)", - "Remarks", + "Remarks\n ", "Ledger API \n" + "error code id", ), ) s"""| |$endpoint - |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + |------------------------------------------------------------------------------------------------------------------ |""".stripMargin + "\n" + tableText } @@ -412,7 +412,7 @@ object SelfServiceErrorCodes_MigrationGuideGen_App { def genSubsectionsForErrorCategory(a: Array[String]) = { s"""${a(0)} - |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + |------------------------------------------------------------------------------------------------------------------ | **Category id**: ${a(1)} | | **gRPC status code**: ${a(2)}