{"id":2221063,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2221063/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260408045531.3006678-10-jsnow@redhat.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/1.1/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260408045531.3006678-10-jsnow@redhat.com>","date":"2026-04-08T04:55:30","name":"[v2,09/10] qapi: re-order 'since' sections to always be last","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"8f6188b1e774292c46edf219a1e9c54554126976","submitter":{"id":64343,"url":"http://patchwork.ozlabs.org/api/1.1/people/64343/?format=json","name":"John Snow","email":"jsnow@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260408045531.3006678-10-jsnow@redhat.com/mbox/","series":[{"id":499174,"url":"http://patchwork.ozlabs.org/api/1.1/series/499174/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=499174","date":"2026-04-08T04:55:23","name":"qapi: enforce section ordering","version":2,"mbox":"http://patchwork.ozlabs.org/series/499174/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2221063/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2221063/checks/","tags":{},"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=P5bw52SJ;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists.gnu.org (unknown [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4frX5V5BhMz1yD3\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 09 Apr 2026 04:43:42 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wAXr6-00053f-63; Wed, 08 Apr 2026 14:42:24 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <jsnow@redhat.com>) id 1wAXqT-0004K0-VA\n for qemu-devel@nongnu.org; Wed, 08 Apr 2026 14:41:46 -0400","from us-smtp-delivery-124.mimecast.com ([170.10.133.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <jsnow@redhat.com>) id 1wAKyW-0005ZC-PQ\n for qemu-devel@nongnu.org; Wed, 08 Apr 2026 00:57:17 -0400","from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-164-z1Bs2XzeP0OTg4RPNBrZqQ-1; Wed,\n 08 Apr 2026 00:57:08 -0400","from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 67E1118005B8; Wed,  8 Apr 2026 04:57:06 +0000 (UTC)","from jsnow-thinkpadp16vgen1.westford.csb (unknown [10.22.88.7])\n by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id C07861955F2B; Wed,  8 Apr 2026 04:56:57 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1775624232;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=A5KvETNoSAY0iG4UYb+sZUqergnBI+QfvJfMfrjiZp0=;\n b=P5bw52SJKNMKo8vQ4g13fwr6fwrGRSlJGMPBozwwloXYvVsdE0hJfodmoJm0rIV3nraPlr\n gvMBCV8mWJXpWOJmQJ00LlLRzJZeBci1An0p4WMvuS9PtL0xIy9khYRvNM/XIZDkchZ/s4\n Z0Ioxuuf2PAJd2i7QYXEtlVnbIPgCZA=","X-MC-Unique":"z1Bs2XzeP0OTg4RPNBrZqQ-1","X-Mimecast-MFC-AGG-ID":"z1Bs2XzeP0OTg4RPNBrZqQ_1775624226","From":"John Snow <jsnow@redhat.com>","To":"qemu-devel@nongnu.org","Cc":"Kashyap Chamarthy <kchamart@redhat.com>,\n Stefan Berger <stefanb@linux.vnet.ibm.com>,\n Mauro Carvalho Chehab <mchehab+huawei@kernel.org>,\n Michael Roth <michael.roth@amd.com>,\n =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>,\n qemu-block@nongnu.org, Pierrick Bouvier <pierrick.bouvier@linaro.org>,\n Yanan Wang <wangyanan55@huawei.com>, Hanna Reitz <hreitz@redhat.com>,\n Peter Xu <peterx@redhat.com>, Igor Mammedov <imammedo@redhat.com>,\n \"Michael S. Tsirkin\" <mst@redhat.com>, Kevin Wolf <kwolf@redhat.com>,\n\t=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n Stefano Garzarella <sgarzare@redhat.com>, =?utf-8?q?Daniel_P=2E_Berrang?=\n\t=?utf-8?q?=C3=A9?= <berrange@redhat.com>, Lukas Straub <lukasstraub2@web.de>,\n Jason Wang <jasowang@redhat.com>, Alex Williamson <alex@shazbot.org>,\n Paolo Bonzini <pbonzini@redhat.com>, Fabiano Rosas <farosas@suse.de>,\n Zhao Liu <zhao1.liu@intel.com>,\n Richard Henderson <richard.henderson@linaro.org>, =?utf-8?q?C=C3=A9dric_Le_?=\n\t=?utf-8?q?Goater?= <clg@redhat.com>, Stefan Hajnoczi <stefanha@redhat.com>,\n Peter Maydell <peter.maydell@linaro.org>, Eric Blake <eblake@redhat.com>,\n\t=?utf-8?q?Alex_Benn=C3=A9e?= <alex.bennee@linaro.org>,\n Kostiantyn Kostiuk <kkostiuk@redhat.com>, Jiri Pirko <jiri@resnulli.us>,\n Markus Armbruster <armbru@redhat.com>, John Snow <jsnow@redhat.com>,\n Ani Sinha <anisinha@redhat.com>,\n Marcel Apfelbaum <marcel.apfelbaum@gmail.com>","Subject":"[PATCH v2 09/10] qapi: re-order 'since' sections to always be last","Date":"Wed,  8 Apr 2026 00:55:30 -0400","Message-ID":"<20260408045531.3006678-10-jsnow@redhat.com>","In-Reply-To":"<20260408045531.3006678-1-jsnow@redhat.com>","References":"<20260408045531.3006678-1-jsnow@redhat.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-Scanned-By":"MIMEDefang 3.0 on 10.30.177.12","Received-SPF":"pass client-ip=170.10.133.124; envelope-from=jsnow@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com","X-Spam_score_int":"-25","X-Spam_score":"-2.6","X-Spam_bar":"--","X-Spam_report":"(-2.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.54,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=0.001,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"Note that with \"Since\" being moved to the last position, we open up a\ngood many new cases of ambiguos intro-vs-details text which must be\ncorrected with \"Details:\" tags.\n\nThese markers are added to this patch in two cases:\n\n(1) Where failing to add it would immediately (i.e. without the future\n    inliner feature) cause a change to the rendered output\n(2) Where failing to add it causes new warning message yelps.\n\nThese cases are not presently delineated.\n\nSigned-off-by: John Snow <jsnow@redhat.com>\n\n---\n\n[Review notes: This patch produces no changes to the *.ir files! --js]\n\nSigned-off-by: John Snow <jsnow@redhat.com>\n---\n docs/interop/firmware.json   |   4 +-\n docs/interop/vhost-user.json |   3 +-\n qapi/accelerator.json        |   8 ++-\n qapi/acpi.json               |   8 ++-\n qapi/block-core.json         | 136 ++++++++++++++++++-----------------\n qapi/block.json              |  40 +++++------\n qapi/char.json               |  36 +++++-----\n qapi/control.json            |  14 ++--\n qapi/dump.json               |  16 ++---\n qapi/machine-s390x.json      |   8 +--\n qapi/machine.json            |  84 +++++++++++++---------\n qapi/migration.json          |  94 +++++++++++++-----------\n qapi/misc-arm.json           |   4 +-\n qapi/misc-i386.json          |  38 +++++-----\n qapi/misc.json               |  64 +++++++++--------\n qapi/net.json                |  40 +++++------\n qapi/pci.json                |   4 +-\n qapi/qdev.json               |  12 ++--\n qapi/qom.json                |  20 +++---\n qapi/replay.json             |  16 +++--\n qapi/rocker.json             |  16 ++---\n qapi/run-state.json          |  66 ++++++++++-------\n qapi/tpm.json                |  12 +++-\n qapi/trace.json              |   8 +--\n qapi/transaction.json        |   4 +-\n qapi/ui.json                 |  76 +++++++++++---------\n qapi/vfio.json               |   4 +-\n qapi/virtio.json             |  20 +++---\n 28 files changed, 472 insertions(+), 383 deletions(-)","diff":"diff --git a/docs/interop/firmware.json b/docs/interop/firmware.json\nindex 421bee0e5ed..bdfb6ccb717 100644\n--- a/docs/interop/firmware.json\n+++ b/docs/interop/firmware.json\n@@ -551,8 +551,6 @@\n #     debugging purposes only, and management software shall\n #     explicitly ignore it.\n #\n-# Since: 3.0\n-#\n # .. qmp-example::\n #\n #     {\n@@ -752,6 +750,8 @@\n #             \"-D DEBUG_PRINT_ERROR_LEVEL=0x80000000\"\n #         ]\n #     }\n+#\n+# Since: 3.0\n ##\n { 'struct' : 'Firmware',\n   'data'   : { 'description'     : 'str',\ndiff --git a/docs/interop/vhost-user.json b/docs/interop/vhost-user.json\nindex 29c84e86e55..fbcf409838d 100644\n--- a/docs/interop/vhost-user.json\n+++ b/docs/interop/vhost-user.json\n@@ -264,8 +264,6 @@\n #     development and debugging purposes only, and management software\n #     shall explicitly ignore it.\n #\n-# Since: 4.0\n-#\n # .. qmp-example:\n #\n # {\n@@ -278,6 +276,7 @@\n #   ]\n # }\n #\n+# Since: 4.0\n ##\n {\n   'struct' : 'VhostUserBackend',\ndiff --git a/qapi/accelerator.json b/qapi/accelerator.json\nindex d333a772384..dfa1288bf3c 100644\n--- a/qapi/accelerator.json\n+++ b/qapi/accelerator.json\n@@ -29,12 +29,14 @@\n #\n # Return information about KVM acceleration\n #\n-# Since: 0.14\n+# Details:\n #\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-kvm\" }\n #     <- { \"return\": { \"enabled\": true, \"present\": true } }\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-kvm', 'returns': 'KvmInfo' }\n \n@@ -101,11 +103,11 @@\n #\n # Returns: @AcceleratorInfo\n #\n-# Since: 10.2.0\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-accelerators\" }\n #     <- { \"return\": { \"enabled\": \"mshv\", \"present\": [\"kvm\", \"mshv\", \"qtest\", \"tcg\"] } }\n+#\n+# Since: 10.2.0\n ##\n { 'command': 'query-accelerators', 'returns': 'AcceleratorInfo' }\ndiff --git a/qapi/acpi.json b/qapi/acpi.json\nindex 906b3687a55..8dd87fd8f22 100644\n--- a/qapi/acpi.json\n+++ b/qapi/acpi.json\n@@ -111,7 +111,7 @@\n # Return a list of `ACPIOSTInfo` for devices that support status\n # reporting via ACPI _OST method.\n #\n-# Since: 2.1\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -121,6 +121,8 @@\n #                      { \"slot\": \"2\", \"slot-type\": \"DIMM\", \"source\": 0, \"status\": 0},\n #                      { \"slot\": \"3\", \"slot-type\": \"DIMM\", \"source\": 0, \"status\": 0}\n #        ]}\n+#\n+# Since: 2.1\n ##\n { 'command': 'query-acpi-ospm-status', 'returns': ['ACPIOSTInfo'] }\n \n@@ -131,14 +133,14 @@\n #\n # @info: OSPM Status Indication\n #\n-# Since: 2.1\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"ACPI_DEVICE_OST\",\n #          \"data\": { \"info\": { \"device\": \"d1\", \"slot\": \"0\",\n #                              \"slot-type\": \"DIMM\", \"source\": 1, \"status\": 0 } },\n #          \"timestamp\": { \"seconds\": 1265044230, \"microseconds\": 450486 } }\n+#\n+# Since: 2.1\n ##\n { 'event': 'ACPI_DEVICE_OST',\n      'data': { 'info': 'ACPIOSTInfo' } }\ndiff --git a/qapi/block-core.json b/qapi/block-core.json\nindex 400ceda9e87..d1f505978c9 100644\n--- a/qapi/block-core.json\n+++ b/qapi/block-core.json\n@@ -862,8 +862,6 @@\n # Returns: a list describing each virtual block device.  Filter nodes\n #     that were created implicitly are skipped over.\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-block\" }\n@@ -947,6 +945,8 @@\n #              }\n #           ]\n #        }\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-block', 'returns': ['BlockInfo'],\n   'data': { '*flat': 'bool' },\n@@ -1267,8 +1267,6 @@\n #\n # Returns: A list of statistics for each virtual block device.\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-blockstats\" }\n@@ -1370,6 +1368,8 @@\n #              }\n #           ]\n #        }\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-blockstats',\n   'data': { '*query-nodes': 'bool' },\n@@ -1560,13 +1560,13 @@\n # Errors:\n #     - If @device is not a valid block device, DeviceNotFound\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"block_resize\",\n #          \"arguments\": { \"device\": \"scratch\", \"size\": 1073741824 } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'block_resize',\n   'data': { '*device': 'str',\n@@ -1788,8 +1788,6 @@\n # Errors:\n #     - If @device is not a valid block device, DeviceNotFound\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"blockdev-snapshot-sync\",\n@@ -1798,6 +1796,8 @@\n #                         \"/some/place/my-image\",\n #                         \"format\": \"qcow2\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'blockdev-snapshot-sync',\n   'data': 'BlockdevSnapshotSync',\n@@ -1820,8 +1820,6 @@\n #     backing file of a destination of a `blockdev-mirror`.\n #     (since 5.0)\n #\n-# Since: 2.5\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"blockdev-add\",\n@@ -1837,6 +1835,8 @@\n #          \"arguments\": { \"node\": \"ide-hd0\",\n #                         \"overlay\": \"node1534\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.5\n ##\n { 'command': 'blockdev-snapshot',\n   'data': 'BlockdevSnapshot',\n@@ -1963,14 +1963,14 @@\n # @deprecated: Members @base and @top are deprecated.  Use @base-node\n #     and @top-node instead.\n #\n-# Since: 1.3\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"block-commit\",\n #          \"arguments\": { \"device\": \"virtio0\",\n #                         \"top\": \"/tmp/snap1.qcow2\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.3\n ##\n { 'command': 'block-commit',\n   'data': { '*job-id': 'str', 'device': 'str', '*base-node': 'str',\n@@ -2001,8 +2001,6 @@\n # @deprecated: This command is deprecated.  Use `blockdev-backup`\n #     instead.\n #\n-# Since: 1.6\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"drive-backup\",\n@@ -2010,6 +2008,8 @@\n #                         \"sync\": \"full\",\n #                         \"target\": \"backup.img\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.6\n ##\n { 'command': 'drive-backup', 'boxed': true,\n   'data': 'DriveBackup', 'features': ['deprecated'],\n@@ -2027,8 +2027,6 @@\n # Errors:\n #     - If @device is not a valid block device, DeviceNotFound\n #\n-# Since: 2.3\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"blockdev-backup\",\n@@ -2036,6 +2034,8 @@\n #                         \"sync\": \"full\",\n #                         \"target\": \"tgt-id\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.3\n ##\n { 'command': 'blockdev-backup', 'boxed': true,\n   'data': 'BlockdevBackup',\n@@ -2049,8 +2049,6 @@\n # @flat: Omit the nested data about backing image (\"backing-image\"\n #     key) if true.  Default is false (Since 5.0)\n #\n-# Since: 2.0\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-named-block-nodes\" }\n@@ -2099,6 +2097,8 @@\n #                               \"virtual-size\":2048000\n #                           }\n #                        } } ] }\n+#\n+# Since: 2.0\n ##\n { 'command': 'query-named-block-nodes',\n   'returns': [ 'BlockDeviceInfo' ],\n@@ -2230,8 +2230,6 @@\n # Errors:\n #     - If @device is not a valid block device, GenericError\n #\n-# Since: 1.3\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"drive-mirror\",\n@@ -2240,6 +2238,8 @@\n #                         \"sync\": \"full\",\n #                         \"format\": \"qcow2\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.3\n ##\n { 'command': 'drive-mirror', 'boxed': true,\n   'data': 'DriveMirror',\n@@ -2407,13 +2407,13 @@\n #     - If @node is not a valid block device or node, DeviceNotFound\n #     - If @name is already taken, GenericError\n #\n-# Since: 2.4\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"block-dirty-bitmap-add\",\n #          \"arguments\": { \"node\": \"drive0\", \"name\": \"bitmap0\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.4\n ##\n { 'command': 'block-dirty-bitmap-add',\n   'data': 'BlockDirtyBitmapAdd',\n@@ -2431,13 +2431,13 @@\n #     - If @name is not found, GenericError\n #     - if @name is frozen by an operation, GenericError\n #\n-# Since: 2.4\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"block-dirty-bitmap-remove\",\n #          \"arguments\": { \"node\": \"drive0\", \"name\": \"bitmap0\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.4\n ##\n { 'command': 'block-dirty-bitmap-remove',\n   'data': 'BlockDirtyBitmap',\n@@ -2454,13 +2454,13 @@\n #     - If @node is not a valid block device, DeviceNotFound\n #     - If @name is not found, GenericError\n #\n-# Since: 2.4\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"block-dirty-bitmap-clear\",\n #          \"arguments\": { \"node\": \"drive0\", \"name\": \"bitmap0\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.4\n ##\n { 'command': 'block-dirty-bitmap-clear',\n   'data': 'BlockDirtyBitmap',\n@@ -2475,13 +2475,13 @@\n #     - If @node is not a valid block device, DeviceNotFound\n #     - If @name is not found, GenericError\n #\n-# Since: 4.0\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"block-dirty-bitmap-enable\",\n #          \"arguments\": { \"node\": \"drive0\", \"name\": \"bitmap0\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 4.0\n ##\n { 'command': 'block-dirty-bitmap-enable',\n   'data': 'BlockDirtyBitmap',\n@@ -2496,13 +2496,13 @@\n #     - If @node is not a valid block device, DeviceNotFound\n #     - If @name is not found, GenericError\n #\n-# Since: 4.0\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"block-dirty-bitmap-disable\",\n #          \"arguments\": { \"node\": \"drive0\", \"name\": \"bitmap0\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 4.0\n ##\n { 'command': 'block-dirty-bitmap-disable',\n   'data': 'BlockDirtyBitmap',\n@@ -2528,14 +2528,14 @@\n #     - If any of the bitmaps have different sizes or granularities,\n #       GenericError\n #\n-# Since: 4.0\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"block-dirty-bitmap-merge\",\n #          \"arguments\": { \"node\": \"drive0\", \"target\": \"bitmap0\",\n #                         \"bitmaps\": [\"bitmap1\"] } }\n #     <- { \"return\": {} }\n+#\n+# Since: 4.0\n ##\n { 'command': 'block-dirty-bitmap-merge',\n   'data': 'BlockDirtyBitmapMerge',\n@@ -2637,8 +2637,6 @@\n #     mirror.  Setting this to true when the destination is not\n #     actually all zero can corrupt the destination.  (Since 10.1)\n #\n-# Since: 2.6\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"blockdev-mirror\",\n@@ -2646,6 +2644,8 @@\n #                         \"target\": \"target0\",\n #                         \"sync\": \"full\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.6\n ##\n { 'command': 'blockdev-mirror',\n   'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',\n@@ -2962,14 +2962,14 @@\n # Errors:\n #     - If @device does not exist, DeviceNotFound.\n #\n-# Since: 1.1\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"block-stream\",\n #          \"arguments\": { \"device\": \"virtio0\",\n #                         \"base\": \"/tmp/master.qcow2\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.1\n ##\n { 'command': 'block-stream',\n   'data': { '*job-id': 'str', 'device': 'str', '*base': 'str',\n@@ -4958,7 +4958,7 @@\n #\n # Creates a new block device.\n #\n-# Since: 2.9\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -4999,6 +4999,8 @@\n #          }\n #\n #     <- { \"return\": {} }\n+#\n+# Since: 2.9\n ##\n { 'command': 'blockdev-add', 'data': 'BlockdevOptions', 'boxed': true,\n   'allow-preconfig': true }\n@@ -5062,8 +5064,6 @@\n #\n # @node-name: Name of the graph node to delete.\n #\n-# Since: 2.9\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"blockdev-add\",\n@@ -5082,6 +5082,8 @@\n #          \"arguments\": { \"node-name\": \"node0\" }\n #        }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.9\n ##\n { 'command': 'blockdev-del', 'data': { 'node-name': 'str' },\n   'allow-preconfig': true }\n@@ -5102,8 +5104,6 @@\n # @active: true if the nodes should be active when the command returns\n #     success, false if they should be inactive.\n #\n-# Since: 10.0\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"blockdev-set-active\",\n@@ -5113,6 +5113,8 @@\n #          }\n #        }\n #     <- { \"return\": {} }\n+#\n+# Since: 10.0\n ##\n { 'command': 'blockdev-set-active',\n   'data': { '*node-name': 'str', 'active': 'bool' },\n@@ -5796,8 +5798,6 @@\n #\n # .. note:: This event is rate-limited, except if action is \"stop\".\n #\n-# Since: 0.13\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"BLOCK_IO_ERROR\",\n@@ -5808,6 +5808,8 @@\n #                    \"action\": \"stop\",\n #                    \"reason\": \"No space left on device\" },\n #          \"timestamp\": { \"seconds\": 1265044230, \"microseconds\": 450486 } }\n+#\n+# Since: 0.13\n ##\n { 'event': 'BLOCK_IO_ERROR',\n   'data': { 'qom-path': 'str', 'device': 'str', '*node-name': 'str',\n@@ -5837,8 +5839,6 @@\n #     other than that streaming has failed and clients should not try\n #     to interpret the error string\n #\n-# Since: 1.1\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"BLOCK_JOB_COMPLETED\",\n@@ -5846,6 +5846,8 @@\n #                    \"len\": 10737418240, \"offset\": 10737418240,\n #                    \"speed\": 0 },\n #          \"timestamp\": { \"seconds\": 1267061043, \"microseconds\": 959568 } }\n+#\n+# Since: 1.1\n ##\n { 'event': 'BLOCK_JOB_COMPLETED',\n   'data': { 'type'  : 'JobType',\n@@ -5872,8 +5874,6 @@\n #\n # @speed: rate limit, bytes per second\n #\n-# Since: 1.1\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"BLOCK_JOB_CANCELLED\",\n@@ -5881,6 +5881,8 @@\n #                    \"len\": 10737418240, \"offset\": 134217728,\n #                    \"speed\": 0 },\n #          \"timestamp\": { \"seconds\": 1267061043, \"microseconds\": 959568 } }\n+#\n+# Since: 1.1\n ##\n { 'event': 'BLOCK_JOB_CANCELLED',\n   'data': { 'type'  : 'JobType',\n@@ -5901,8 +5903,6 @@\n #\n # @action: action that has been taken\n #\n-# Since: 1.3\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"BLOCK_JOB_ERROR\",\n@@ -5910,6 +5910,8 @@\n #                    \"operation\": \"write\",\n #                    \"action\": \"stop\" },\n #          \"timestamp\": { \"seconds\": 1265044230, \"microseconds\": 450486 } }\n+#\n+# Since: 1.3\n ##\n { 'event': 'BLOCK_JOB_ERROR',\n   'data': { 'device'   : 'str',\n@@ -5936,14 +5938,14 @@\n # .. note:: The \"ready to complete\" status is always reset by a\n #    `BLOCK_JOB_ERROR` event.\n #\n-# Since: 1.3\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"BLOCK_JOB_READY\",\n #          \"data\": { \"device\": \"drive0\", \"type\": \"mirror\", \"speed\": 0,\n #                    \"len\": 2097152, \"offset\": 2097152 },\n #          \"timestamp\": { \"seconds\": 1265044230, \"microseconds\": 450486 } }\n+#\n+# Since: 1.3\n ##\n { 'event': 'BLOCK_JOB_READY',\n   'data': { 'type'  : 'JobType',\n@@ -5964,13 +5966,13 @@\n #\n # @id: The job identifier.\n #\n-# Since: 2.12\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"BLOCK_JOB_PENDING\",\n #          \"data\": { \"type\": \"mirror\", \"id\": \"backup_1\" },\n #          \"timestamp\": { \"seconds\": 1265044230, \"microseconds\": 450486 } }\n+#\n+# Since: 2.12\n ##\n { 'event': 'BLOCK_JOB_PENDING',\n   'data': { 'type'  : 'JobType',\n@@ -6038,14 +6040,14 @@\n # @write-threshold: configured threshold for the block device, bytes.\n #     Use 0 to disable the threshold.\n #\n-# Since: 2.3\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"block-set-write-threshold\",\n #          \"arguments\": { \"node-name\": \"mydev\",\n #                         \"write-threshold\": 17179869184 } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.3\n ##\n { 'command': 'block-set-write-threshold',\n   'data': { 'node-name': 'str', 'write-threshold': 'uint64' },\n@@ -6079,8 +6081,6 @@\n #     'children' list of `BlockdevOptionsQuorum`, as returned by\n #     .bdrv_refresh_filename().\n #\n-# Since: 2.7\n-#\n # .. qmp-example::\n #    :title: Add a new node to a quorum\n #\n@@ -6103,6 +6103,8 @@\n #          \"arguments\": { \"parent\": \"disk1\",\n #                         \"child\": \"children.1\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.7\n ##\n { 'command': 'x-blockdev-change',\n   'data' : { 'parent': 'str',\n@@ -6131,8 +6133,6 @@\n # @unstable: This command is experimental and intended for test cases\n #     that need control over IOThreads only.\n #\n-# Since: 2.12\n-#\n # .. qmp-example::\n #    :title: Move a node into an IOThread\n #\n@@ -6148,6 +6148,8 @@\n #          \"arguments\": { \"node-name\": \"disk1\",\n #                         \"iothread\": null } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.12\n ##\n { 'command': 'x-blockdev-set-iothread',\n   'data' : { 'node-name': 'str',\n@@ -6185,13 +6187,13 @@\n #\n # .. note:: This event is rate-limited.\n #\n-# Since: 2.0\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"QUORUM_FAILURE\",\n #          \"data\": { \"reference\": \"usr1\", \"sector-num\": 345435, \"sectors-count\": 5 },\n #          \"timestamp\": { \"seconds\": 1344522075, \"microseconds\": 745528 } }\n+#\n+# Since: 2.0\n ##\n { 'event': 'QUORUM_FAILURE',\n   'data': { 'reference': 'str', 'sector-num': 'int', 'sectors-count': 'int' } }\n@@ -6216,8 +6218,6 @@\n #\n # .. note:: This event is rate-limited.\n #\n-# Since: 2.0\n-#\n # .. qmp-example::\n #    :title: Read operation\n #\n@@ -6233,6 +6233,8 @@\n #          \"data\": { \"node-name\": \"node0\", \"sector-num\": 0, \"sectors-count\": 2097120,\n #                    \"type\": \"flush\", \"error\": \"Broken pipe\" },\n #          \"timestamp\": { \"seconds\": 1456406829, \"microseconds\": 291763 } }\n+#\n+# Since: 2.0\n ##\n { 'event': 'QUORUM_REPORT_BAD',\n   'data': { 'type': 'QuorumOpType', '*error': 'str', 'node-name': 'str',\n@@ -6269,8 +6271,6 @@\n # .. note:: Only some image formats such as qcow2 and rbd support\n #    internal snapshots.\n #\n-# Since: 1.7\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"blockdev-snapshot-internal-sync\",\n@@ -6278,6 +6278,8 @@\n #                         \"name\": \"snapshot0\" }\n #        }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.7\n ##\n { 'command': 'blockdev-snapshot-internal-sync',\n   'data': 'BlockdevSnapshotInternal',\n@@ -6305,8 +6307,6 @@\n #       GenericError\n #     - If @id and @name are both not specified, GenericError\n #\n-# Since: 1.7\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"blockdev-snapshot-delete-internal-sync\",\n@@ -6324,6 +6324,8 @@\n #                        \"icount\": 220414\n #          }\n #        }\n+#\n+# Since: 1.7\n ##\n { 'command': 'blockdev-snapshot-delete-internal-sync',\n   'data': { 'device': 'str', '*id': 'str', '*name': 'str'},\ndiff --git a/qapi/block.json b/qapi/block.json\nindex 54bc0056318..a29907e0be1 100644\n--- a/qapi/block.json\n+++ b/qapi/block.json\n@@ -118,12 +118,12 @@\n #\n # .. note:: Ejecting a device with no media results in success.\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"eject\", \"arguments\": { \"id\": \"ide1-0-1\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'eject',\n   'data': { '*device': { 'type': 'str', 'features': [ 'deprecated' ] },\n@@ -162,8 +162,6 @@\n #\n # @deprecated: Member @device is deprecated.  Use @id instead.\n #\n-# Since: 2.5\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"blockdev-open-tray\",\n@@ -177,6 +175,8 @@\n #                    \"tray-open\": true } }\n #\n #     <- { \"return\": {} }\n+#\n+# Since: 2.5\n ##\n { 'command': 'blockdev-open-tray',\n   'data': { '*device': { 'type': 'str', 'features': [ 'deprecated' ] },\n@@ -200,8 +200,6 @@\n #\n # @deprecated: Member @device is deprecated.  Use @id instead.\n #\n-# Since: 2.5\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"blockdev-close-tray\",\n@@ -215,6 +213,8 @@\n #                    \"tray-open\": false } }\n #\n #     <- { \"return\": {} }\n+#\n+# Since: 2.5\n ##\n { 'command': 'blockdev-close-tray',\n   'data': { '*device': { 'type': 'str', 'features': [ 'deprecated' ] },\n@@ -232,8 +232,6 @@\n #\n # @id: The name or QOM path of the guest device\n #\n-# Since: 2.12\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"blockdev-remove-medium\",\n@@ -258,6 +256,8 @@\n #          \"arguments\": { \"id\": \"ide0-1-0\" } }\n #\n #     <- { \"return\": {} }\n+#\n+# Since: 2.12\n ##\n { 'command': 'blockdev-remove-medium',\n   'data': { 'id': 'str' } }\n@@ -273,8 +273,6 @@\n #\n # @node-name: name of a node in the block driver state graph\n #\n-# Since: 2.12\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"blockdev-add\",\n@@ -290,6 +288,8 @@\n #                         \"node-name\": \"node0\" } }\n #\n #     <- { \"return\": {} }\n+#\n+# Since: 2.12\n ##\n { 'command': 'blockdev-insert-medium',\n   'data': { 'id': 'str',\n@@ -343,8 +343,6 @@\n #\n # @deprecated: Member @device is deprecated.  Use @id instead.\n #\n-# Since: 2.5\n-#\n # .. qmp-example::\n #    :title: Change a removable medium\n #\n@@ -374,6 +372,8 @@\n #                         \"read-only-mode\": \"read-only\" } }\n #\n #     <- { \"return\": {} }\n+#\n+# Since: 2.5\n ##\n { 'command': 'blockdev-change-medium',\n   'data': { '*device': { 'type': 'str', 'features': [ 'deprecated' ] },\n@@ -398,8 +398,6 @@\n # @tray-open: true if the tray has been opened or false if it has been\n #     closed\n #\n-# Since: 1.1\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"DEVICE_TRAY_MOVED\",\n@@ -408,6 +406,8 @@\n #                    \"tray-open\": true\n #          },\n #          \"timestamp\": { \"seconds\": 1265044230, \"microseconds\": 450486 } }\n+#\n+# Since: 1.1\n ##\n { 'event': 'DEVICE_TRAY_MOVED',\n   'data': { 'device': 'str', 'id': 'str', 'tray-open': 'bool' } }\n@@ -422,8 +422,6 @@\n #\n # @connected: true if the PR manager is connected to a backend\n #\n-# Since: 3.0\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"PR_MANAGER_STATUS_CHANGED\",\n@@ -431,6 +429,8 @@\n #                    \"connected\": true\n #          },\n #          \"timestamp\": { \"seconds\": 1519840375, \"microseconds\": 450486 } }\n+#\n+# Since: 3.0\n ##\n { 'event': 'PR_MANAGER_STATUS_CHANGED',\n   'data': { 'id': 'str', 'connected': 'bool' } }\n@@ -464,8 +464,6 @@\n # Errors:\n #     - If @device is not a valid block device, DeviceNotFound\n #\n-# Since: 1.1\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"block_set_io_throttle\",\n@@ -505,6 +503,8 @@\n #                         \"bps_max_length\": 60,\n #                         \"iops_size\": 0 } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.1\n ##\n { 'command': 'block_set_io_throttle', 'boxed': true,\n   'data': 'BlockIOThrottle',\n@@ -546,8 +546,6 @@\n # Errors:\n #     - if device is not found or any boundary arrays are invalid.\n #\n-# Since: 4.0\n-#\n # .. qmp-example::\n #    :annotated:\n #\n@@ -594,6 +592,8 @@\n #     -> { \"execute\": \"block-latency-histogram-set\",\n #          \"arguments\": { \"id\": \"drive0\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 4.0\n ##\n { 'command': 'block-latency-histogram-set',\n   'data': {'id': 'str',\ndiff --git a/qapi/char.json b/qapi/char.json\nindex a4abafa6803..4ff980d356b 100644\n--- a/qapi/char.json\n+++ b/qapi/char.json\n@@ -38,7 +38,7 @@\n #\n # Return information about current character devices.\n #\n-# Since: 0.14\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -62,6 +62,8 @@\n #              }\n #           ]\n #        }\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-chardev', 'returns': ['ChardevInfo'],\n   'allow-preconfig': true }\n@@ -82,7 +84,7 @@\n #\n # Return information about character device backends.\n #\n-# Since: 2.0\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -103,6 +105,8 @@\n #              }\n #           ]\n #        }\n+#\n+# Since: 2.0\n ##\n { 'command': 'query-chardev-backends', 'returns': ['ChardevBackendInfo'] }\n \n@@ -137,8 +141,6 @@\n #     - data itself is always Unicode regardless of format, like any\n #       other string.\n #\n-# Since: 1.4\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"ringbuf-write\",\n@@ -146,6 +148,8 @@\n #                         \"data\": \"abcdefgh\",\n #                         \"format\": \"utf8\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.4\n ##\n { 'command': 'ringbuf-write',\n   'data': { 'device': 'str',\n@@ -173,8 +177,6 @@\n #\n # Returns: data read from the device\n #\n-# Since: 1.4\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"ringbuf-read\",\n@@ -182,6 +184,8 @@\n #                         \"size\": 1000,\n #                         \"format\": \"utf8\" } }\n #     <- { \"return\": \"abcdefgh\" }\n+#\n+# Since: 1.4\n ##\n { 'command': 'ringbuf-read',\n   'data': {'device': 'str', 'size': 'int', '*format': 'DataFormat'},\n@@ -761,8 +765,6 @@\n #\n # @backend: backend type and parameters\n #\n-# Since: 1.4\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\" : \"chardev-add\",\n@@ -784,6 +786,8 @@\n #          \"arguments\" : { \"id\" : \"baz\",\n #                          \"backend\" : { \"type\" : \"pty\", \"data\" : {} } } }\n #     <- { \"return\": { \"pty\" : \"/dev/pty/42\" } }\n+#\n+# Since: 1.4\n ##\n { 'command': 'chardev-add',\n   'data': { 'id': 'str',\n@@ -799,8 +803,6 @@\n #\n # @backend: new backend type and parameters\n #\n-# Since: 2.10\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\" : \"chardev-change\",\n@@ -825,6 +827,8 @@\n #                      \"server\" : true,\n #                      \"wait\" : false }}}}\n #     <- {\"return\": {}}\n+#\n+# Since: 2.10\n ##\n { 'command': 'chardev-change',\n   'data': { 'id': 'str',\n@@ -838,12 +842,12 @@\n #\n # @id: the chardev's ID, must exist and not be in use\n #\n-# Since: 1.4\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"chardev-remove\", \"arguments\": { \"id\" : \"foo\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.4\n ##\n { 'command': 'chardev-remove',\n   'data': { 'id': 'str' } }\n@@ -855,12 +859,12 @@\n #\n # @id: the chardev's ID, must exist\n #\n-# Since: 2.10\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"chardev-send-break\", \"arguments\": { \"id\" : \"foo\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.10\n ##\n { 'command': 'chardev-send-break',\n   'data': { 'id': 'str' } }\n@@ -876,13 +880,13 @@\n #\n # .. note:: This event is rate-limited.\n #\n-# Since: 2.1\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"VSERPORT_CHANGE\",\n #          \"data\": { \"id\": \"channel0\", \"open\": true },\n #          \"timestamp\": { \"seconds\": 1401385907, \"microseconds\": 422329 } }\n+#\n+# Since: 2.1\n ##\n { 'event': 'VSERPORT_CHANGE',\n   'data': { 'id': 'str',\ndiff --git a/qapi/control.json b/qapi/control.json\nindex 9a5302193d6..758b176de72 100644\n--- a/qapi/control.json\n+++ b/qapi/control.json\n@@ -97,8 +97,6 @@\n #\n # Returns: An object describing the current version of QEMU.\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-version\" }\n@@ -112,6 +110,8 @@\n #              \"package\":\"\"\n #           }\n #        }\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-version', 'returns': 'VersionInfo',\n   'allow-preconfig': true }\n@@ -134,8 +134,6 @@\n #\n # Returns: A list of all supported commands\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-commands\" }\n@@ -152,6 +150,8 @@\n #        }\n #\n # This example has been shortened as the real response is too long.\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-commands', 'returns': ['CommandInfo'],\n   'allow-preconfig': true }\n@@ -161,16 +161,18 @@\n #\n # Request graceful QEMU process termination.\n #\n+# Details:\n+#\n # While every attempt is made to send the QMP response before\n # terminating, this is not guaranteed.  When using this interface, a\n # premature EOF would not be unexpected.\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"quit\" }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'quit',\n   'allow-preconfig': true }\ndiff --git a/qapi/dump.json b/qapi/dump.json\nindex 726b5208703..bda1c731544 100644\n--- a/qapi/dump.json\n+++ b/qapi/dump.json\n@@ -94,13 +94,13 @@\n #\n # .. note:: All boolean arguments default to false.\n #\n-# Since: 1.2\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"dump-guest-memory\",\n #          \"arguments\": { \"paging\": false, \"protocol\": \"fd:dump\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.2\n ##\n { 'command': 'dump-guest-memory',\n   'data': { 'paging': 'bool', 'protocol': 'str', '*detach': 'bool',\n@@ -150,13 +150,13 @@\n #\n # Returns: An object showing the dump status.\n #\n-# Since: 2.6\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-dump\" }\n #     <- { \"return\": { \"status\": \"active\", \"completed\": 1024000,\n #                      \"total\": 2048000 } }\n+#\n+# Since: 2.6\n ##\n { 'command': 'query-dump', 'returns': 'DumpQueryResult' }\n \n@@ -171,14 +171,14 @@\n #     failed.  Only presents on failure.  The user should not try to\n #     interpret the error string.\n #\n-# Since: 2.6\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"DUMP_COMPLETED\",\n #          \"data\": { \"result\": { \"total\": 1090650112, \"status\": \"completed\",\n #                                \"completed\": 1090650112 } },\n #          \"timestamp\": { \"seconds\": 1648244171, \"microseconds\": 950316 } }\n+#\n+# Since: 2.6\n ##\n { 'event': 'DUMP_COMPLETED' ,\n   'data': { 'result': 'DumpQueryResult', '*error': 'str' } }\n@@ -201,13 +201,13 @@\n #\n # Returns: An object listing available formats for `dump-guest-memory`\n #\n-# Since: 2.0\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-dump-guest-memory-capability\" }\n #     <- { \"return\": { \"formats\":\n #                      [\"elf\", \"kdump-zlib\", \"kdump-lzo\", \"kdump-snappy\"] } }\n+#\n+# Since: 2.0\n ##\n { 'command': 'query-dump-guest-memory-capability',\n   'returns': 'DumpGuestMemoryCapability' }\ndiff --git a/qapi/machine-s390x.json b/qapi/machine-s390x.json\nindex e67f180a272..adc986418d7 100644\n--- a/qapi/machine-s390x.json\n+++ b/qapi/machine-s390x.json\n@@ -79,13 +79,13 @@\n #\n # @unstable: This event is experimental.\n #\n-# Since: 8.2\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"CPU_POLARIZATION_CHANGE\",\n #          \"data\": { \"polarization\": \"horizontal\" },\n #          \"timestamp\": { \"seconds\": 1401385907, \"microseconds\": 422329 } }\n+#\n+# Since: 8.2\n ##\n { 'event': 'CPU_POLARIZATION_CHANGE',\n   'data': { 'polarization': 'S390CpuPolarization' },\n@@ -130,12 +130,12 @@\n #\n # @unstable: This event is experimental.\n #\n-# Since: 10.2\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"SCLP_CPI_INFO_AVAILABLE\",\n #          \"timestamp\": { \"seconds\": 1401385907, \"microseconds\": 422329 } }\n+#\n+# Since: 10.2\n ##\n { 'event': 'SCLP_CPI_INFO_AVAILABLE',\n   'features': [ 'unstable' ]\ndiff --git a/qapi/machine.json b/qapi/machine.json\nindex 0a4b758b2d5..2cfa4b9b046 100644\n--- a/qapi/machine.json\n+++ b/qapi/machine.json\n@@ -108,7 +108,7 @@\n #\n # Return information about all virtual CPUs.\n #\n-# Since: 2.12\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -138,6 +138,8 @@\n #             }\n #         ]\n #     }\n+#\n+# Since: 2.12\n ##\n { 'command': 'query-cpus-fast', 'returns': [ 'CpuInfoFast' ] }\n \n@@ -223,8 +225,6 @@\n #\n # @unstable: Argument @compat-props is experimental.\n #\n-# Since: 1.2\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-machines\", \"arguments\": { \"compat-props\": true } }\n@@ -247,6 +247,8 @@\n #               },\n #               ...\n #        }\n+#\n+# Since: 1.2\n ##\n { 'command': 'query-machines',\n   'data': { '*compat-props': { 'type': 'bool',\n@@ -303,10 +305,10 @@\n #\n # @UUID: the UUID of the guest\n #\n-# Since: 0.14\n-#\n # .. note:: If no UUID was specified for the guest, the nil UUID (all\n #    zeroes) is returned.\n+#\n+# Since: 0.14\n ##\n { 'struct': 'UuidInfo', 'data': {'UUID': 'str'} }\n \n@@ -315,12 +317,14 @@\n #\n # Query the guest UUID information.\n #\n-# Since: 0.14\n+# Details:\n #\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-uuid\" }\n #     <- { \"return\": { \"UUID\": \"550e8400-e29b-41d4-a716-446655440000\" } }\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-uuid', 'returns': 'UuidInfo', 'allow-preconfig': true }\n \n@@ -349,12 +353,14 @@\n #\n # Performs a hard reset of a guest.\n #\n-# Since: 0.14\n+# Details:\n #\n # .. qmp-example::\n #\n #     -> { \"execute\": \"system_reset\" }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'system_reset' }\n \n@@ -363,7 +369,7 @@\n #\n # Requests that a guest perform a powerdown operation.\n #\n-# Since: 0.14\n+# Details:\n #\n # .. note:: A guest may or may not respond to this command.  This\n #    command returning does not indicate that a guest has accepted the\n@@ -374,6 +380,8 @@\n #\n #     -> { \"execute\": \"system_powerdown\" }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'system_powerdown' }\n \n@@ -385,7 +393,7 @@\n # `query-current-machine`), wake-up guest from suspend if the guest is\n # in SUSPENDED state.  Return an error otherwise.\n #\n-# Since: 1.1\n+# Details:\n #\n # .. note:: Prior to 4.0, this command does nothing in case the guest\n #    isn't suspended.\n@@ -394,6 +402,8 @@\n #\n #     -> { \"execute\": \"system_wakeup\" }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.1\n ##\n { 'command': 'system_wakeup' }\n \n@@ -436,7 +446,7 @@\n # all CPUs (ppc64).  The command fails when the guest doesn't support\n # injecting.\n #\n-# Since: 0.14\n+# Details:\n #\n # .. note:: Prior to 2.1, this command was only supported for x86 and\n #    s390 VMs.\n@@ -445,6 +455,8 @@\n #\n #     -> { \"execute\": \"inject-nmi\" }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'inject-nmi' }\n \n@@ -806,8 +818,6 @@\n # @cpu-index: the index of the virtual CPU to use for translating the\n #     virtual address (defaults to CPU 0)\n #\n-# Since: 0.14\n-#\n # .. caution:: Errors were not reliably returned until 1.1.\n #\n # .. qmp-example::\n@@ -817,6 +827,8 @@\n #                         \"size\": 100,\n #                         \"filename\": \"/tmp/virtual-mem-dump\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'memsave',\n   'data': {\n@@ -836,8 +848,6 @@\n #\n # @filename: the file to save the memory to as binary data\n #\n-# Since: 0.14\n-#\n # .. caution:: Errors were not reliably returned until 1.1.\n #\n # .. qmp-example::\n@@ -847,6 +857,8 @@\n #                         \"size\": 100,\n #                         \"filename\": \"/tmp/physical-mem-dump\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'pmemsave',\n   'data': {\n@@ -900,7 +912,7 @@\n #\n # Return information for all memory backends.\n #\n-# Since: 2.1\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -927,6 +939,8 @@\n #            }\n #          ]\n #        }\n+#\n+# Since: 2.1\n ##\n { 'command': 'query-memdev', 'returns': ['Memdev'], 'allow-preconfig': true }\n \n@@ -1015,8 +1029,6 @@\n #\n # TODO: Better documentation; currently there is none.\n #\n-# Since: 2.7\n-#\n # .. qmp-example::\n #    :annotated:\n #\n@@ -1067,6 +1079,8 @@\n #             \"props\": { \"core-id\": 0 }\n #          }\n #        ]}\n+#\n+# Since: 2.7\n ##\n { 'command': 'query-hotpluggable-cpus', 'returns': ['HotpluggableCPU'],\n              'allow-preconfig': true }\n@@ -1105,8 +1119,6 @@\n #    returns, the balloon size may not have changed.  A guest can\n #    change the balloon size independent of this command.\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #    :annotated:\n #\n@@ -1116,6 +1128,8 @@\n #      <- { \"return\": {} }\n #\n #    With a 2.5GiB guest this command inflated the ballon to 3GiB.\n+#\n+# Since: 0.14\n ##\n { 'command': 'balloon', 'data': {'value': 'int'} }\n \n@@ -1141,8 +1155,6 @@\n #       the KVM kernel module cannot support it, KVMMissingCap\n #     - If no balloon device is present, DeviceNotActive\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-balloon\" }\n@@ -1150,6 +1162,8 @@\n #              \"actual\": 1073741824\n #           }\n #        }\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-balloon', 'returns': 'BalloonInfo' }\n \n@@ -1165,13 +1179,13 @@\n #\n # .. note:: This event is rate-limited.\n #\n-# Since: 1.2\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"BALLOON_CHANGE\",\n #          \"data\": { \"actual\": 944766976 },\n #          \"timestamp\": { \"seconds\": 1267020223, \"microseconds\": 435656 } }\n+#\n+# Since: 1.2\n ##\n { 'event': 'BALLOON_CHANGE',\n   'data': { 'actual': 'int' } }\n@@ -1204,8 +1218,6 @@\n #       reporting is not enabled or no guest memory status report\n #       received yet, GenericError\n #\n-# Since: 8.2\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-hv-balloon-status-report\" }\n@@ -1214,6 +1226,8 @@\n #              \"available\": 3333054464\n #           }\n #        }\n+#\n+# Since: 8.2\n ##\n { 'command': 'query-hv-balloon-status-report', 'returns': 'HvBalloonInfo' }\n \n@@ -1227,13 +1241,13 @@\n #\n # .. note:: This event is rate-limited.\n #\n-# Since: 8.2\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"HV_BALLOON_STATUS_REPORT\",\n #          \"data\": { \"committed\": 816640000, \"available\": 3333054464 },\n #          \"timestamp\": { \"seconds\": 1600295492, \"microseconds\": 661044 } }\n+#\n+# Since: 8.2\n ##\n { 'event': 'HV_BALLOON_STATUS_REPORT',\n   'data': 'HvBalloonInfo' }\n@@ -1540,7 +1554,7 @@\n #\n # Lists available memory devices and their state\n #\n-# Since: 2.1\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -1556,6 +1570,8 @@\n #                             \"slot\": 0},\n #                        \"type\": \"dimm\"\n #                      } ] }\n+#\n+# Since: 2.1\n ##\n { 'command': 'query-memory-devices', 'returns': ['MemoryDeviceInfo'] }\n \n@@ -1574,14 +1590,14 @@\n #\n # .. note:: This event is rate-limited.\n #\n-# Since: 5.1\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"MEMORY_DEVICE_SIZE_CHANGE\",\n #          \"data\": { \"id\": \"vm0\", \"size\": 1073741824,\n #                    \"qom-path\": \"/machine/unattached/device[2]\" },\n #          \"timestamp\": { \"seconds\": 1588168529, \"microseconds\": 201316 } }\n+#\n+# Since: 5.1\n ##\n { 'event': 'MEMORY_DEVICE_SIZE_CHANGE',\n   'data': { '*id': 'str', 'size': 'size', 'qom-path' : 'str'} }\n@@ -1814,13 +1830,13 @@\n #\n # @filename: name of the dtb file to be created\n #\n-# Since: 7.2\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"dumpdtb\" }\n #          \"arguments\": { \"filename\": \"fdt.dtb\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 7.2\n ##\n { 'command': 'dumpdtb',\n   'data': { 'filename': 'str' },\n@@ -1879,13 +1895,13 @@\n #\n # @filename: the path to the file to dump to\n #\n-# Since: 2.5\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"dump-skeys\",\n #          \"arguments\": { \"filename\": \"/tmp/skeys\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.5\n ##\n { 'command': 'dump-skeys',\n   'data': { 'filename': 'str' } }\ndiff --git a/qapi/migration.json b/qapi/migration.json\nindex 558b4f145ed..79c24e36958 100644\n--- a/qapi/migration.json\n+++ b/qapi/migration.json\n@@ -339,7 +339,7 @@\n # Return information about current migration process.  If migration is\n # active there will be another json-object with RAM migration status.\n #\n-# Since: 0.14\n+# Details:\n #\n # .. qmp-example::\n #    :title: Before the first migration\n@@ -426,6 +426,8 @@\n #              }\n #           }\n #        }\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-migrate', 'returns': 'MigrationInfo' }\n \n@@ -562,13 +564,13 @@\n #\n # @capabilities: json array of capability modifications to make\n #\n-# Since: 1.2\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"migrate-set-capabilities\" , \"arguments\":\n #          { \"capabilities\": [ { \"capability\": \"xbzrle\", \"state\": true } ] } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.2\n ##\n { 'command': 'migrate-set-capabilities',\n   'data': { 'capabilities': ['MigrationCapabilityStatus'] } }\n@@ -578,7 +580,7 @@\n #\n # Return information about the current migration capabilities status\n #\n-# Since: 1.2\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -591,6 +593,8 @@\n #           {\"state\": false, \"capability\": \"postcopy-ram\"},\n #           {\"state\": false, \"capability\": \"x-colo\"}\n #        ]}\n+#\n+# Since: 1.2\n ##\n { 'command': 'query-migrate-capabilities', 'returns':   ['MigrationCapabilityStatus']}\n \n@@ -838,13 +842,15 @@\n #\n # Set migration parameters.  All arguments are optional.\n #\n-# Since: 2.4\n+# Details:\n #\n # .. qmp-example::\n #\n #     -> { \"execute\": \"migrate-set-parameters\" ,\n #          \"arguments\": { \"multifd-channels\": 5 } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.4\n ##\n { 'command': 'migrate-set-parameters', 'boxed': true,\n   'data': 'MigrationParameters' }\n@@ -1056,7 +1062,7 @@\n # @block-bitmap-mapping, which is only present if it has been\n # previously set.\n #\n-# Since: 2.4\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -1069,6 +1075,8 @@\n #              \"downtime-limit\": 300\n #           }\n #        }\n+#\n+# Since: 2.4\n ##\n { 'command': 'query-migrate-parameters',\n   'returns': 'MigrationParameters' }\n@@ -1080,12 +1088,14 @@\n # mode.  The postcopy-ram capability must be set on both source and\n # destination before the original migration command.\n #\n-# Since: 2.5\n+# Details:\n #\n # .. qmp-example::\n #\n #     -> { \"execute\": \"migrate-start-postcopy\" }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.5\n ##\n { 'command': 'migrate-start-postcopy' }\n \n@@ -1096,13 +1106,13 @@\n #\n # @status: `MigrationStatus` describing the current migration status.\n #\n-# Since: 2.4\n-#\n # .. qmp-example::\n #\n #     <- {\"timestamp\": {\"seconds\": 1432121972, \"microseconds\": 744001},\n #         \"event\": \"MIGRATION\",\n #         \"data\": {\"status\": \"completed\"} }\n+#\n+# Since: 2.4\n ##\n { 'event': 'MIGRATION',\n   'data': {'status': 'MigrationStatus'}}\n@@ -1115,12 +1125,12 @@\n #\n # @pass: An incrementing count (starting at 1 on the first pass)\n #\n-# Since: 2.6\n-#\n # .. qmp-example::\n #\n #     <- { \"timestamp\": {\"seconds\": 1449669631, \"microseconds\": 239225},\n #           \"event\": \"MIGRATION_PASS\", \"data\": {\"pass\": 2} }\n+#\n+# Since: 2.6\n ##\n { 'event': 'MIGRATION_PASS',\n   'data': { 'pass': 'int' } }\n@@ -1199,12 +1209,12 @@\n #\n # @reason: describes the reason for the COLO exit.\n #\n-# Since: 3.1\n-#\n # .. qmp-example::\n #\n #     <- { \"timestamp\": {\"seconds\": 2032141960, \"microseconds\": 417172},\n #          \"event\": \"COLO_EXIT\", \"data\": {\"mode\": \"primary\", \"reason\": \"request\" } }\n+#\n+# Since: 3.1\n ##\n { 'event': 'COLO_EXIT',\n   'data': {'mode': 'COLOMode', 'reason': 'COLOExitReason' } }\n@@ -1242,12 +1252,12 @@\n #\n # @unstable: This command is experimental.\n #\n-# Since: 2.8\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"x-colo-lost-heartbeat\" }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.8\n ##\n { 'command': 'x-colo-lost-heartbeat',\n   'features': [ 'unstable' ],\n@@ -1260,15 +1270,17 @@\n # migration to be started right after.  When postcopy-ram is in use,\n # cancelling is not allowed after the postcopy phase has started.\n #\n+# Details:\n+#\n # .. note:: This command succeeds even if there is no migration\n #    process running.\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"migrate_cancel\" }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'migrate_cancel' }\n \n@@ -1279,13 +1291,13 @@\n #\n # @state: The state the migration is currently expected to be in\n #\n-# Since: 2.11\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"migrate-continue\" , \"arguments\":\n #          { \"state\": \"pre-switchover\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.11\n ##\n { 'command': 'migrate-continue', 'data': {'state': 'MigrationStatus'} }\n \n@@ -1394,8 +1406,6 @@\n #     will fail unless migration is in \"postcopy-paused\" state.\n #     (default: false, since 3.0)\n #\n-# Since: 0.14\n-#\n # .. admonition:: Notes\n #\n #     1. The `query-migrate` command should be used to check\n@@ -1449,6 +1459,8 @@\n #                                        \"filename\": \"/tmp/migfile\",\n #                                        \"offset\": \"0x1000\" } } ] } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'migrate',\n   'data': {'*uri': 'str',\n@@ -1472,8 +1484,6 @@\n #     :qapi:event:`MIGRATION` event, and error details could be\n #     retrieved with `query-migrate`.  (since 9.1)\n #\n-# Since: 2.3\n-#\n # .. admonition:: Notes\n #\n #     1. It's a bad idea to use a string for the uri, but it needs to\n@@ -1521,6 +1531,8 @@\n #                                        \"host\": \"10.12.34.9\",\n #                                        \"port\": \"1050\" } } ] } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.3\n ##\n { 'command': 'migrate-incoming',\n              'data': {'*uri': 'str',\n@@ -1540,13 +1552,13 @@\n # @live: Optional argument to ask QEMU to treat this command as part\n #     of a live migration.  Default to true.  (since 2.11)\n #\n-# Since: 1.1\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"xen-save-devices-state\",\n #          \"arguments\": { \"filename\": \"/tmp/save\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.1\n ##\n { 'command': 'xen-save-devices-state',\n   'data': {'filename': 'str', '*live':'bool' } }\n@@ -1558,13 +1570,13 @@\n #\n # @enable: true to enable, false to disable.\n #\n-# Since: 1.3\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"xen-set-global-dirty-log\",\n #          \"arguments\": { \"enable\": true } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.3\n ##\n { 'command': 'xen-set-global-dirty-log', 'data': { 'enable': 'bool' } }\n \n@@ -1578,13 +1590,13 @@\n #     data.  See `xen-save-devices-state`.txt for a description of the\n #     binary format.\n #\n-# Since: 2.7\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"xen-load-devices-state\",\n #          \"arguments\": { \"filename\": \"/tmp/resume\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.7\n ##\n { 'command': 'xen-load-devices-state', 'data': {'filename': 'str'} }\n \n@@ -1747,13 +1759,13 @@\n #\n # @device-id: QEMU device id of the unplugged device\n #\n-# Since: 4.2\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"UNPLUG_PRIMARY\",\n #          \"data\": { \"device-id\": \"hostdev0\" },\n #          \"timestamp\": { \"seconds\": 1265044230, \"microseconds\": 450486 } }\n+#\n+# Since: 4.2\n ##\n { 'event': 'UNPLUG_PRIMARY',\n   'data': { 'device-id': 'str' } }\n@@ -1907,8 +1919,6 @@\n #     'page-sampling'.  Others are 'dirty-bitmap' and 'dirty-ring'.\n #     (Since 6.1)\n #\n-# Since: 5.2\n-#\n # .. qmp-example::\n #\n #     -> {\"execute\": \"calc-dirty-rate\", \"arguments\": {\"calc-time\": 1,\n@@ -1924,6 +1934,8 @@\n #         \"calc-time-unit\": \"millisecond\", \"mode\": \"dirty-bitmap\"} }\n #\n #     <- { \"return\": {} }\n+#\n+# Since: 5.2\n ##\n { 'command': 'calc-dirty-rate', 'data': {'calc-time': 'int64',\n                                          '*calc-time-unit': 'TimeUnit',\n@@ -1938,8 +1950,6 @@\n # @calc-time-unit: time unit in which to report calculation time.\n #     By default it is reported in seconds.  (Since 8.2)\n #\n-# Since: 5.2\n-#\n # .. qmp-example::\n #    :title: Measurement is in progress\n #\n@@ -1953,6 +1963,8 @@\n #     <- {\"status\": \"measured\", \"sample-pages\": 512, \"dirty-rate\": 108,\n #         \"mode\": \"page-sampling\", \"start-time\": 1693900454, \"calc-time\": 10,\n #         \"calc-time-unit\": \"second\"}\n+#\n+# Since: 5.2\n ##\n { 'command': 'query-dirty-rate', 'data': {'*calc-time-unit': 'TimeUnit' },\n                                  'returns': 'DirtyRateInfo' }\n@@ -1989,14 +2001,14 @@\n #\n # @dirty-rate: upper limit of dirty page rate (MB/s) for virtual CPUs.\n #\n-# Since: 7.1\n-#\n # .. qmp-example::\n #\n #     -> {\"execute\": \"set-vcpu-dirty-limit\"}\n #         \"arguments\": { \"dirty-rate\": 200,\n #                        \"cpu-index\": 1 } }\n #     <- { \"return\": {} }\n+#\n+# Since: 7.1\n ##\n { 'command': 'set-vcpu-dirty-limit',\n   'data': { '*cpu-index': 'int',\n@@ -2013,13 +2025,13 @@\n #\n # @cpu-index: index of a virtual CPU, default is all.\n #\n-# Since: 7.1\n-#\n # .. qmp-example::\n #\n #     -> {\"execute\": \"cancel-vcpu-dirty-limit\"},\n #         \"arguments\": { \"cpu-index\": 1 } }\n #     <- { \"return\": {} }\n+#\n+# Since: 7.1\n ##\n { 'command': 'cancel-vcpu-dirty-limit',\n   'data': { '*cpu-index': 'int'} }\n@@ -2029,7 +2041,7 @@\n #\n # Return information about virtual CPU dirty page rate limits, if any.\n #\n-# Since: 7.1\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -2037,6 +2049,8 @@\n #     <- {\"return\": [\n #            { \"limit-rate\": 60, \"current-rate\": 3, \"cpu-index\": 0},\n #            { \"limit-rate\": 60, \"current-rate\": 3, \"cpu-index\": 1}]}\n+#\n+# Since: 7.1\n ##\n { 'command': 'query-vcpu-dirty-limit',\n   'returns': [ 'DirtyLimitInfo' ] }\ndiff --git a/qapi/misc-arm.json b/qapi/misc-arm.json\nindex 4e3f1a54055..4a2746ee1aa 100644\n--- a/qapi/misc-arm.json\n+++ b/qapi/misc-arm.json\n@@ -38,13 +38,13 @@\n # On non-ARM targets this command will report an error as the GIC\n # technology is not applicable.\n #\n-# Since: 2.6\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-gic-capabilities\" }\n #     <- { \"return\": [{ \"version\": 2, \"emulated\": true, \"kernel\": false },\n #                     { \"version\": 3, \"emulated\": false, \"kernel\": true } ] }\n+#\n+# Since: 2.6\n ##\n { 'command': 'query-gic-capabilities', 'returns': ['GICCapability'] }\n \ndiff --git a/qapi/misc-i386.json b/qapi/misc-i386.json\nindex c92853507f3..01cdf8d706e 100644\n--- a/qapi/misc-i386.json\n+++ b/qapi/misc-i386.json\n@@ -10,16 +10,18 @@\n # mechanism to synchronize guest time is in effect, for example QEMU\n # guest agent's `guest-set-time` command.\n #\n+# Details:\n+#\n # Use of this command is only applicable for x86 machines with an RTC,\n # and on other machines will silently return without performing any\n # action.\n #\n-# Since: 2.1\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"rtc-reset-reinjection\" }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.1\n ##\n { 'command': 'rtc-reset-reinjection' }\n \n@@ -133,14 +135,14 @@\n # @enabled field is set to 'false' and the state of all other fields\n # is unspecified.\n #\n-# Since: 2.12\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-sev\" }\n #     <- { \"return\": { \"enabled\": true, \"api-major\" : 0, \"api-minor\" : 0,\n #                      \"build-id\" : 0, \"policy\" : 0, \"state\" : \"running\",\n #                      \"handle\" : 1 } }\n+#\n+# Since: 2.12\n ##\n { 'command': 'query-sev', 'returns': 'SevInfo' }\n \n@@ -171,12 +173,12 @@\n #       invalid guest configuration or if the guest has not reached\n #       the required SEV state, GenericError\n #\n-# Since: 2.12\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-sev-launch-measure\" }\n #     <- { \"return\": { \"data\": \"4l8LXeNlSPUDlXPJG5966/8%YZ\" } }\n+#\n+# Since: 2.12\n ##\n { 'command': 'query-sev-launch-measure', 'returns': 'SevLaunchMeasureInfo' }\n \n@@ -216,14 +218,14 @@\n # Errors:\n #     - If SEV is not available on the platform, GenericError\n #\n-# Since: 2.12\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-sev-capabilities\" }\n #     <- { \"return\": { \"pdh\": \"8CCDD8DDD\", \"cert-chain\": \"888CCCDDDEE\",\n #                      \"cpu0-id\": \"2lvmGwo+...61iEinw==\",\n #                      \"cbitpos\": 47, \"reduced-phys-bits\": 1}}\n+#\n+# Since: 2.12\n ##\n { 'command': 'query-sev-capabilities', 'returns': 'SevCapability' }\n \n@@ -282,13 +284,13 @@\n #       invalid guest configuration or because the guest has not\n #       reached the required SEV state, GenericError\n #\n-# Since: 6.1\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\" : \"query-sev-attestation-report\",\n #                      \"arguments\": { \"mnonce\": \"aaaaaaa\" } }\n #     <- { \"return\" : { \"data\": \"aaaaaaaabbbddddd\"} }\n+#\n+# Since: 6.1\n ##\n { 'command': 'query-sev-attestation-report',\n   'data': { 'mnonce': 'str' },\n@@ -338,7 +340,7 @@\n #\n # Return information about configured SGX capabilities of guest\n #\n-# Since: 6.2\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -347,6 +349,8 @@\n #                      \"flc\": true,\n #                      \"sections\": [{\"node\": 0, \"size\": 67108864},\n #                      {\"node\": 1, \"size\": 29360128}]} }\n+#\n+# Since: 6.2\n ##\n { 'command': 'query-sgx', 'returns': 'SgxInfo' }\n \n@@ -355,7 +359,7 @@\n #\n # Return information about SGX capabilities of host\n #\n-# Since: 6.2\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -364,6 +368,8 @@\n #                      \"flc\": true,\n #                      \"section\" : [{\"node\": 0, \"size\": 67108864},\n #                      {\"node\": 1, \"size\": 29360128}]} }\n+#\n+# Since: 6.2\n ##\n { 'command': 'query-sgx-capabilities', 'returns': 'SgxInfo' }\n \n@@ -426,8 +432,6 @@\n #\n # Returns: list of open event channel ports.\n #\n-# Since: 8.0\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"xen-event-list\" }\n@@ -452,6 +456,8 @@\n #             }\n #          ]\n #        }\n+#\n+# Since: 8.0\n ##\n { 'command': 'xen-event-list',\n   'returns': ['EvtchnInfo'] }\n@@ -463,12 +469,12 @@\n #\n # @port: The port number\n #\n-# Since: 8.0\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"xen-event-inject\", \"arguments\": { \"port\": 1 } }\n #     <- { \"return\": { } }\n+#\n+# Since: 8.0\n ##\n { 'command': 'xen-event-inject',\n   'data': { 'port': 'uint32' } }\ndiff --git a/qapi/misc.json b/qapi/misc.json\nindex 05866837f09..40f5b9559cb 100644\n--- a/qapi/misc.json\n+++ b/qapi/misc.json\n@@ -30,13 +30,13 @@\n #\n # @tls: whether to perform TLS.  Only applies to the \"spice\" protocol\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"add_client\", \"arguments\": { \"protocol\": \"vnc\",\n #                                                  \"fdname\": \"myclient\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'add_client',\n   'data': { 'protocol': 'str', 'fdname': 'str', '*skipauth': 'bool',\n@@ -58,12 +58,14 @@\n #\n # Return the name information of a guest.\n #\n-# Since: 0.14\n+# Details:\n #\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-name\" }\n #     <- { \"return\": { \"name\": \"qemu-name\" } }\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-name', 'returns': 'NameInfo', 'allow-preconfig': true }\n \n@@ -109,8 +111,6 @@\n #\n # Returns: a list of info for each iothread\n #\n-# Since: 2.0\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-iothreads\" }\n@@ -125,6 +125,8 @@\n #              }\n #           ]\n #        }\n+#\n+# Since: 2.0\n ##\n { 'command': 'query-iothreads', 'returns': ['IOThreadInfo'],\n   'allow-preconfig': true }\n@@ -134,7 +136,7 @@\n #\n # Stop guest VM execution.\n #\n-# Since: 0.14\n+# Details:\n #\n # .. note:: This function will succeed even if the guest is already in\n #    the stopped state.  In \"inmigrate\" state, it will ensure that the\n@@ -148,6 +150,8 @@\n #\n #     -> { \"execute\": \"stop\" }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'stop' }\n \n@@ -156,7 +160,7 @@\n #\n # Resume guest VM execution.\n #\n-# Since: 0.14\n+# Details:\n #\n # .. note:: This command will succeed if the guest is currently\n #    running.  It will also succeed if the guest is in the \"inmigrate\"\n@@ -172,6 +176,8 @@\n #\n #     -> { \"execute\": \"cont\" }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'cont' }\n \n@@ -190,12 +196,12 @@\n #\n # @unstable: This command is experimental.\n #\n-# Since: 3.0\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"x-exit-preconfig\" }\n #     <- { \"return\": {} }\n+#\n+# Since: 3.0\n ##\n { 'command': 'x-exit-preconfig', 'allow-preconfig': true,\n   'features': [ 'unstable' ] }\n@@ -217,8 +223,6 @@\n #     monitor-owned nodes if they have no parents.  This allows the\n #     use of 'savevm' with -blockdev.  (since 4.2)\n #\n-# Since: 0.14\n-#\n # .. note:: This command only exists as a stop-gap.  Its use is highly\n #    discouraged.  The semantics of this command are not guaranteed:\n #    this means that command names, arguments and responses can change\n@@ -237,6 +241,8 @@\n #     -> { \"execute\": \"human-monitor-command\",\n #          \"arguments\": { \"command-line\": \"info kvm\" } }\n #     <- { \"return\": \"kvm support: enabled\\r\\n\" }\n+#\n+# Since: 0.14\n ##\n { 'command': 'human-monitor-command',\n   'data': {'command-line': 'str', '*cpu-index': 'int'},\n@@ -250,8 +256,6 @@\n #\n # @fdname: file descriptor name\n #\n-# Since: 0.14\n-#\n # .. note:: If @fdname already exists, the file descriptor assigned to\n #    it will be closed and replaced by the received file descriptor.\n #\n@@ -262,6 +266,8 @@\n #\n #     -> { \"execute\": \"getfd\", \"arguments\": { \"fdname\": \"fd1\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'getfd', 'data': {'fdname': 'str'}, 'if': 'CONFIG_POSIX' }\n \n@@ -277,8 +283,6 @@\n #\n # @fdname: file descriptor name\n #\n-# Since: 8.0\n-#\n # .. note:: If @fdname already exists, the file descriptor assigned to\n #    it will be closed and replaced by the received file descriptor.\n #\n@@ -290,6 +294,8 @@\n #     -> { \"execute\": \"get-win32-socket\",\n #          \"arguments\": { \"info\": \"abcd123..\", \"fdname\": \"skclient\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 8.0\n ##\n { 'command': 'get-win32-socket', 'data': {'info': 'str', 'fdname': 'str'}, 'if': 'CONFIG_WIN32' }\n \n@@ -300,12 +306,12 @@\n #\n # @fdname: file descriptor name\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"closefd\", \"arguments\": { \"fdname\": \"fd1\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'closefd', 'data': {'fdname': 'str'} }\n \n@@ -341,12 +347,12 @@\n # .. note:: If @fdset-id is not specified, a new fd set will be\n #    created.\n #\n-# Since: 1.2\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"add-fd\", \"arguments\": { \"fdset-id\": 1 } }\n #     <- { \"return\": { \"fdset-id\": 1, \"fd\": 3 } }\n+#\n+# Since: 1.2\n ##\n { 'command': 'add-fd',\n   'data': { '*fdset-id': 'int',\n@@ -365,8 +371,6 @@\n # Errors:\n #     - If @fdset-id or @fd is not found, GenericError\n #\n-# Since: 1.2\n-#\n # .. note:: The list of fd sets is shared by all monitor connections.\n #\n # .. note:: If @fd is not specified, all file descriptors in @fdset-id\n@@ -376,6 +380,8 @@\n #\n #     -> { \"execute\": \"remove-fd\", \"arguments\": { \"fdset-id\": 1, \"fd\": 3 } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.2\n ##\n { 'command': 'remove-fd', 'data': {'fdset-id': 'int', '*fd': 'int'} }\n \n@@ -412,7 +418,7 @@\n #\n # Return information describing all fd sets.\n #\n-# Since: 1.2\n+# Details:\n #\n # .. note:: The list of fd sets is shared by all monitor connections.\n #\n@@ -446,6 +452,8 @@\n #            }\n #          ]\n #        }\n+#\n+# Since: 1.2\n ##\n { 'command': 'query-fdsets', 'returns': ['FdsetInfo'] }\n \n@@ -516,8 +524,6 @@\n # Errors:\n #     - if the given @option doesn't exist\n #\n-# Since: 1.5\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-command-line-options\",\n@@ -538,6 +544,8 @@\n #             }\n #          ]\n #        }\n+#\n+# Since: 1.5\n ##\n {'command': 'query-command-line-options',\n  'data': {'*option': 'str'},\n@@ -558,13 +566,13 @@\n #    RTC in the system implements this event, or even that the system\n #    has an RTC at all.\n #\n-# Since: 0.13\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"RTC_CHANGE\",\n #          \"data\": { \"offset\": 78 },\n #          \"timestamp\": { \"seconds\": 1267020223, \"microseconds\": 435656 } }\n+#\n+# Since: 0.13\n ##\n { 'event': 'RTC_CHANGE',\n   'data': { 'offset': 'int', 'qom-path': 'str' } }\n@@ -585,8 +593,6 @@\n #\n # @dev-qom-path: path to attached PCI device in the QOM tree\n #\n-# Since: 7.1\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"VFU_CLIENT_HANGUP\",\n@@ -595,6 +601,8 @@\n #                    \"dev-id\": \"sas1\",\n #                    \"dev-qom-path\": \"/machine/peripheral/sas1\" },\n #          \"timestamp\": { \"seconds\": 1265044230, \"microseconds\": 450486 } }\n+#\n+# Since: 7.1\n ##\n { 'event': 'VFU_CLIENT_HANGUP',\n   'data': { 'vfu-id': 'str', 'vfu-qom-path': 'str',\ndiff --git a/qapi/net.json b/qapi/net.json\nindex c011d6dc1a9..2deb0b6dfdf 100644\n--- a/qapi/net.json\n+++ b/qapi/net.json\n@@ -22,8 +22,6 @@\n # Errors:\n #     - If @name is not a valid network device, DeviceNotFound\n #\n-# Since: 0.14\n-#\n # .. note:: Not all network adapters support setting link status.\n #    This command will succeed even if the network adapter does not\n #    support link status notification.\n@@ -33,6 +31,8 @@\n #     -> { \"execute\": \"set_link\",\n #          \"arguments\": { \"name\": \"e1000.0\", \"up\": false } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'set_link', 'data': {'name': 'str', 'up': 'bool'} }\n \n@@ -43,8 +43,6 @@\n #\n # Additional arguments depend on the type.\n #\n-# Since: 0.14\n-#\n # Errors:\n #     - If @type is not a valid network backend, DeviceNotFound\n #\n@@ -54,6 +52,8 @@\n #          \"arguments\": { \"type\": \"user\", \"id\": \"netdev1\",\n #                         \"dnssearch\": [ { \"str\": \"example.org\" } ] } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'netdev_add', 'data': 'Netdev', 'boxed': true,\n   'allow-preconfig': true }\n@@ -68,12 +68,12 @@\n # Errors:\n #     - If @id is not a valid network backend, DeviceNotFound\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"netdev_del\", \"arguments\": { \"id\": \"netdev1\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'netdev_del', 'data': {'id': 'str'},\n   'allow-preconfig': true }\n@@ -975,8 +975,6 @@\n #     - if the given NIC doesn't support rx-filter querying\n #     - if the given net client isn't a NIC\n #\n-# Since: 1.6\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-rx-filter\", \"arguments\": { \"name\": \"vnet0\" } }\n@@ -1005,6 +1003,8 @@\n #             }\n #           ]\n #        }\n+#\n+# Since: 1.6\n ##\n { 'command': 'query-rx-filter',\n   'data': { '*name': 'str' },\n@@ -1020,14 +1020,14 @@\n #\n # @path: device path\n #\n-# Since: 1.6\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"NIC_RX_FILTER_CHANGED\",\n #          \"data\": { \"name\": \"vnet0\",\n #                    \"path\": \"/machine/peripheral/vnet0/virtio-backend\" },\n #          \"timestamp\": { \"seconds\": 1368697518, \"microseconds\": 326866 } }\n+#\n+# Since: 1.6\n ##\n { 'event': 'NIC_RX_FILTER_CHANGED',\n   'data': { '*name': 'str', 'path': 'str' } }\n@@ -1095,13 +1095,13 @@\n #\n # @device-id: QEMU device id of the unplugged device\n #\n-# Since: 4.2\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"FAILOVER_NEGOTIATED\",\n #          \"data\": { \"device-id\": \"net1\" },\n #          \"timestamp\": { \"seconds\": 1368697518, \"microseconds\": 326866 } }\n+#\n+# Since: 4.2\n ##\n { 'event': 'FAILOVER_NEGOTIATED',\n   'data': {'device-id': 'str'} }\n@@ -1115,8 +1115,6 @@\n #\n # @addr: The destination address\n #\n-# Since: 7.2\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"NETDEV_STREAM_CONNECTED\",\n@@ -1131,6 +1129,8 @@\n #          \"data\": { \"netdev-id\": \"netdev0\",\n #                    \"addr\": { \"path\": \"/tmp/qemu0\", \"type\": \"unix\" } },\n #          \"timestamp\": { \"seconds\": 1666269706, \"microseconds\": 413651 } }\n+#\n+# Since: 7.2\n ##\n { 'event': 'NETDEV_STREAM_CONNECTED',\n   'data': { 'netdev-id': 'str',\n@@ -1143,13 +1143,13 @@\n #\n # @netdev-id: QEMU netdev id that is disconnected\n #\n-# Since: 7.2\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"NETDEV_STREAM_DISCONNECTED\",\n #          \"data\": {\"netdev-id\": \"netdev0\"},\n #          \"timestamp\": {\"seconds\": 1663330937, \"microseconds\": 526695} }\n+#\n+# Since: 7.2\n ##\n { 'event': 'NETDEV_STREAM_DISCONNECTED',\n   'data': { 'netdev-id': 'str' } }\n@@ -1163,13 +1163,13 @@\n #\n # @chardev-id: The character device id used by the QEMU netdev\n #\n-# Since: 10.0\n-#\n # .. qmp-example::\n #\n #     <- { \"timestamp\": {\"seconds\": 1739538638, \"microseconds\": 354181 },\n #          \"event\": \"NETDEV_VHOST_USER_CONNECTED\",\n #          \"data\": { \"netdev-id\": \"netdev0\", \"chardev-id\": \"chr0\" } }\n+#\n+# Since: 10.0\n ##\n { 'event': 'NETDEV_VHOST_USER_CONNECTED',\n   'data': { 'netdev-id': 'str', 'chardev-id': 'str' } }\n@@ -1181,13 +1181,13 @@\n #\n # @netdev-id: QEMU netdev id that is disconnected\n #\n-# Since: 10.0\n-#\n # .. qmp-example::\n #\n #     <- { \"timestamp\": { \"seconds\": 1739538634, \"microseconds\": 920450 },\n #          \"event\": \"NETDEV_VHOST_USER_DISCONNECTED\",\n #          \"data\": { \"netdev-id\": \"netdev0\" } }\n+#\n+# Since: 10.0\n ##\n { 'event': 'NETDEV_VHOST_USER_DISCONNECTED',\n   'data': { 'netdev-id': 'str' } }\ndiff --git a/qapi/pci.json b/qapi/pci.json\nindex 694c741e420..c36af01a100 100644\n--- a/qapi/pci.json\n+++ b/qapi/pci.json\n@@ -182,8 +182,6 @@\n #     of all PCI devices attached to it.  Each device is represented\n #     by a json-object.\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-pci\" }\n@@ -314,5 +312,7 @@\n #        }\n #\n # This example has been shortened as the real response is too long.\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-pci', 'returns': ['PciInfo'] }\ndiff --git a/qapi/qdev.json b/qapi/qdev.json\nindex 974cf9c5830..483bc9eb9cd 100644\n--- a/qapi/qdev.json\n+++ b/qapi/qdev.json\n@@ -103,8 +103,6 @@\n #    device will not be removed and a `DEVICE_UNPLUG_GUEST_ERROR`\n #    event is sent.  Some errors cannot be detected.\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"device_del\",\n@@ -116,6 +114,8 @@\n #     -> { \"execute\": \"device_del\",\n #          \"arguments\": { \"id\": \"/machine/peripheral-anon/device[0]\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'device_del', 'data': {'id': 'str'} }\n \n@@ -131,14 +131,14 @@\n #\n # @path: the device's QOM path\n #\n-# Since: 1.5\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"DEVICE_DELETED\",\n #          \"data\": { \"device\": \"virtio-net-pci-0\",\n #                    \"path\": \"/machine/peripheral/virtio-net-pci-0\" },\n #          \"timestamp\": { \"seconds\": 1265044230, \"microseconds\": 450486 } }\n+#\n+# Since: 1.5\n ##\n { 'event': 'DEVICE_DELETED',\n   'data': { '*device': 'str', 'path': 'str' } }\n@@ -153,14 +153,14 @@\n #\n # @path: the device's QOM path\n #\n-# Since: 6.2\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"DEVICE_UNPLUG_GUEST_ERROR\",\n #          \"data\": { \"device\": \"core1\",\n #                    \"path\": \"/machine/peripheral/core1\" },\n #          \"timestamp\": { \"seconds\": 1615570772, \"microseconds\": 202844 } }\n+#\n+# Since: 6.2\n ##\n { 'event': 'DEVICE_UNPLUG_GUEST_ERROR',\n   'data': { '*device': 'str', 'path': 'str' } }\ndiff --git a/qapi/qom.json b/qapi/qom.json\nindex fd88be07e13..9733a815a9b 100644\n--- a/qapi/qom.json\n+++ b/qapi/qom.json\n@@ -85,8 +85,6 @@\n #\n # Returns: a list that describe the properties of the object.\n #\n-# Since: 1.2\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"qom-list\",\n@@ -95,6 +93,8 @@\n #                      { \"name\": \"parallel0\", \"type\": \"child<chardev-vc>\" },\n #                      { \"name\": \"serial0\", \"type\": \"child<chardev-vc>\" },\n #                      { \"name\": \"mon0\", \"type\": \"child<chardev-stdio>\" } ] }\n+#\n+# Since: 1.2\n ##\n { 'command': 'qom-list',\n   'data': { 'path': 'str' },\n@@ -129,8 +129,6 @@\n #     child<> and link<> properties are returned as #str pathnames.\n #     All integer property types (u8, u16, etc) are returned as #int.\n #\n-# Since: 1.2\n-#\n # .. qmp-example::\n #    :title: Use absolute path\n #\n@@ -146,6 +144,8 @@\n #          \"arguments\": { \"path\": \"unattached/sysbus\",\n #                         \"property\": \"type\" } }\n #     <- { \"return\": \"System\" }\n+#\n+# Since: 1.2\n ##\n { 'command': 'qom-get',\n   'data': { 'path': 'str', 'property': 'str' },\n@@ -186,8 +186,6 @@\n # @value: a value who's type is appropriate for the property type.\n #     See `qom-get` for a description of type mapping.\n #\n-# Since: 1.2\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"qom-set\",\n@@ -195,6 +193,8 @@\n #                         \"property\": \"graphics\",\n #                         \"value\": false } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.2\n ##\n { 'command': 'qom-set',\n   'data': { 'path': 'str', 'property': 'str', 'value': 'any' },\n@@ -1342,14 +1342,14 @@\n # Errors:\n #     - If @qom-type is not a valid class name\n #\n-# Since: 2.0\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"object-add\",\n #          \"arguments\": { \"qom-type\": \"rng-random\", \"id\": \"rng1\",\n #                         \"filename\": \"/dev/hwrng\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.0\n ##\n { 'command': 'object-add', 'data': 'ObjectOptions', 'boxed': true,\n   'allow-preconfig': true }\n@@ -1364,12 +1364,12 @@\n # Errors:\n #     - If @id is not a valid id for a QOM object\n #\n-# Since: 2.0\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"object-del\", \"arguments\": { \"id\": \"rng1\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.0\n ##\n { 'command': 'object-del', 'data': {'id': 'str'},\n   'allow-preconfig': true }\ndiff --git a/qapi/replay.json b/qapi/replay.json\nindex ccf84da68ef..bdee8e0ecfe 100644\n--- a/qapi/replay.json\n+++ b/qapi/replay.json\n@@ -54,12 +54,12 @@\n #\n # Returns: record/replay information.\n #\n-# Since: 5.2\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-replay\" }\n #     <- { \"return\": { \"mode\": \"play\", \"filename\": \"log.rr\", \"icount\": 220414 } }\n+#\n+# Since: 5.2\n ##\n { 'command': 'query-replay',\n   'returns': 'ReplayInfo' }\n@@ -76,12 +76,12 @@\n #\n # @icount: instruction count to stop at\n #\n-# Since: 5.2\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"replay-break\", \"arguments\": { \"icount\": 220414 } }\n #     <- { \"return\": {} }\n+#\n+# Since: 5.2\n ##\n { 'command': 'replay-break', 'data': { 'icount': 'int' } }\n \n@@ -91,12 +91,14 @@\n # Remove replay breakpoint which was set with `replay-break`.  The\n # command is ignored when there are no replay breakpoints.\n #\n-# Since: 5.2\n+# Details:\n #\n # .. qmp-example::\n #\n #     -> { \"execute\": \"replay-delete-break\" }\n #     <- { \"return\": {} }\n+#\n+# Since: 5.2\n ##\n { 'command': 'replay-delete-break' }\n \n@@ -112,11 +114,11 @@\n #\n # @icount: target instruction count\n #\n-# Since: 5.2\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"replay-seek\", \"arguments\": { \"icount\": 220414 } }\n #     <- { \"return\": {} }\n+#\n+# Since: 5.2\n ##\n { 'command': 'replay-seek', 'data': { 'icount': 'int' } }\ndiff --git a/qapi/rocker.json b/qapi/rocker.json\nindex 5d2dbd26034..e8efffc4c9f 100644\n--- a/qapi/rocker.json\n+++ b/qapi/rocker.json\n@@ -30,12 +30,12 @@\n #\n # @name: switch name\n #\n-# Since: 2.4\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-rocker\", \"arguments\": { \"name\": \"sw1\" } }\n #     <- { \"return\": {\"name\": \"sw1\", \"ports\": 2, \"id\": 1327446905938}}\n+#\n+# Since: 2.4\n ##\n { 'command': 'query-rocker',\n   'data': { 'name': 'str' },\n@@ -98,8 +98,6 @@\n #\n # @name: port name\n #\n-# Since: 2.4\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-rocker-ports\", \"arguments\": { \"name\": \"sw1\" } }\n@@ -108,6 +106,8 @@\n #                      {\"duplex\": \"full\", \"enabled\": true, \"name\": \"sw1.2\",\n #                       \"autoneg\": \"off\", \"link-up\": true, \"speed\": 10000}\n #        ]}\n+#\n+# Since: 2.4\n ##\n { 'command': 'query-rocker-ports',\n   'data': { 'name': 'str' },\n@@ -240,8 +240,6 @@\n #\n # Returns: rocker OF-DPA flow information\n #\n-# Since: 2.4\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-rocker-of-dpa-flows\",\n@@ -254,6 +252,8 @@\n #                      },\n #                      ...\n #        ]}\n+#\n+# Since: 2.4\n ##\n { 'command': 'query-rocker-of-dpa-flows',\n   'data': { 'name': 'str', '*tbl-id': 'uint32' },\n@@ -315,8 +315,6 @@\n #\n # Returns: rocker OF-DPA group information\n #\n-# Since: 2.4\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-rocker-of-dpa-groups\",\n@@ -334,6 +332,8 @@\n #                       \"pport\": 0, \"vlan-id\": 3840,\n #                       \"pop-vlan\": 1, \"id\": 251658240}\n #        ]}\n+#\n+# Since: 2.4\n ##\n { 'command': 'query-rocker-of-dpa-groups',\n   'data': { 'name': 'str', '*type': 'uint8' },\ndiff --git a/qapi/run-state.json b/qapi/run-state.json\nindex a5771ad4681..1bc4e905f00 100644\n--- a/qapi/run-state.json\n+++ b/qapi/run-state.json\n@@ -121,13 +121,15 @@\n #\n # Query the run status of the VM\n #\n-# Since: 0.14\n+# Details:\n #\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-status\" }\n #     <- { \"return\": { \"running\": true,\n #                      \"status\": \"running\" } }\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-status', 'returns': 'StatusInfo',\n   'allow-preconfig': true }\n@@ -150,13 +152,13 @@\n #    specified, QEMU will not exit, and a `STOP` event will eventually\n #    follow the `SHUTDOWN` event.\n #\n-# Since: 0.12\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"SHUTDOWN\",\n #          \"data\": { \"guest\": true, \"reason\": \"guest-shutdown\" },\n #          \"timestamp\": { \"seconds\": 1267040730, \"microseconds\": 682951 } }\n+#\n+# Since: 0.12\n ##\n { 'event': 'SHUTDOWN', 'data': { 'guest': 'bool', 'reason': 'ShutdownCause' } }\n \n@@ -166,12 +168,14 @@\n # Emitted when the virtual machine is powered down through the power\n # control system, such as via ACPI.\n #\n-# Since: 0.12\n+# Details:\n #\n # .. qmp-example::\n #\n #     <- { \"event\": \"POWERDOWN\",\n #          \"timestamp\": { \"seconds\": 1267040730, \"microseconds\": 682951 } }\n+#\n+# Since: 0.12\n ##\n { 'event': 'POWERDOWN' }\n \n@@ -187,13 +191,13 @@\n #\n # @reason: The `ShutdownCause` of the `RESET`.  (since 4.0)\n #\n-# Since: 0.12\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"RESET\",\n #          \"data\": { \"guest\": false, \"reason\": \"guest-reset\" },\n #          \"timestamp\": { \"seconds\": 1267041653, \"microseconds\": 9518 } }\n+#\n+# Since: 0.12\n ##\n { 'event': 'RESET', 'data': { 'guest': 'bool', 'reason': 'ShutdownCause' } }\n \n@@ -202,12 +206,14 @@\n #\n # Emitted when the virtual machine is stopped\n #\n-# Since: 0.12\n+# Details:\n #\n # .. qmp-example::\n #\n #     <- { \"event\": \"STOP\",\n #          \"timestamp\": { \"seconds\": 1267041730, \"microseconds\": 281295 } }\n+#\n+# Since: 0.12\n ##\n { 'event': 'STOP' }\n \n@@ -216,12 +222,14 @@\n #\n # Emitted when the virtual machine resumes execution\n #\n-# Since: 0.12\n+# Details:\n #\n # .. qmp-example::\n #\n #     <- { \"event\": \"RESUME\",\n #          \"timestamp\": { \"seconds\": 1271770767, \"microseconds\": 582542 } }\n+#\n+# Since: 0.12\n ##\n { 'event': 'RESUME' }\n \n@@ -231,12 +239,14 @@\n # Emitted when guest enters a hardware suspension state, for example,\n # S3 state, which is sometimes called standby state\n #\n-# Since: 1.1\n+# Details:\n #\n # .. qmp-example::\n #\n #     <- { \"event\": \"SUSPEND\",\n #          \"timestamp\": { \"seconds\": 1344456160, \"microseconds\": 309119 } }\n+#\n+# Since: 1.1\n ##\n { 'event': 'SUSPEND' }\n \n@@ -247,15 +257,17 @@\n # saved on disk, for example, S4 state, which is sometimes called\n # hibernate state\n #\n+# Details:\n+#\n # .. note:: QEMU shuts down (similar to event `SHUTDOWN`) when\n #    entering this state.\n #\n-# Since: 1.2\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"SUSPEND_DISK\",\n #          \"timestamp\": { \"seconds\": 1344456160, \"microseconds\": 309119 } }\n+#\n+# Since: 1.2\n ##\n { 'event': 'SUSPEND_DISK' }\n \n@@ -265,12 +277,14 @@\n # Emitted when the guest has woken up from suspend state and is\n # running\n #\n-# Since: 1.1\n+# Details:\n #\n # .. qmp-example::\n #\n #     <- { \"event\": \"WAKEUP\",\n #          \"timestamp\": { \"seconds\": 1344522075, \"microseconds\": 745528 } }\n+#\n+# Since: 1.1\n ##\n { 'event': 'WAKEUP' }\n \n@@ -287,13 +301,13 @@\n #\n # .. note:: This event is rate-limited.\n #\n-# Since: 0.13\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"WATCHDOG\",\n #          \"data\": { \"action\": \"reset\" },\n #          \"timestamp\": { \"seconds\": 1267061043, \"microseconds\": 959568 } }\n+#\n+# Since: 0.13\n ##\n { 'event': 'WATCHDOG',\n   'data': { 'action': 'WatchdogAction' } }\n@@ -380,13 +394,13 @@\n #\n # @action: `WatchdogAction` action taken when watchdog timer expires.\n #\n-# Since: 2.11\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"watchdog-set-action\",\n #          \"arguments\": { \"action\": \"inject-nmi\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.11\n ##\n { 'command': 'watchdog-set-action', 'data' : {'action': 'WatchdogAction'} }\n \n@@ -405,8 +419,6 @@\n # @watchdog: `WatchdogAction` action taken when watchdog timer\n #     expires.\n #\n-# Since: 6.0\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"set-action\",\n@@ -415,6 +427,8 @@\n #                         \"panic\": \"pause\",\n #                         \"watchdog\": \"inject-nmi\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 6.0\n ##\n { 'command': 'set-action',\n   'data': { '*reboot': 'RebootAction',\n@@ -432,13 +446,13 @@\n #\n # @info: information about a panic (since 2.9)\n #\n-# Since: 1.5\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"GUEST_PANICKED\",\n #          \"data\": { \"action\": \"pause\" },\n #          \"timestamp\": { \"seconds\": 1648245231, \"microseconds\": 900001 } }\n+#\n+# Since: 1.5\n ##\n { 'event': 'GUEST_PANICKED',\n   'data': { 'action': 'GuestPanicAction', '*info': 'GuestPanicInformation' } }\n@@ -452,13 +466,13 @@\n #\n # @info: information about a panic\n #\n-# Since: 5.0\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"GUEST_CRASHLOADED\",\n #          \"data\": { \"action\": \"run\" },\n #          \"timestamp\": { \"seconds\": 1648245259, \"microseconds\": 893771 } }\n+#\n+# Since: 5.0\n ##\n { 'event': 'GUEST_CRASHLOADED',\n   'data': { 'action': 'GuestPanicAction', '*info': 'GuestPanicInformation' } }\n@@ -468,12 +482,14 @@\n #\n # Emitted when guest submits a shutdown request via pvpanic interface\n #\n-# Since: 9.1\n+# Details:\n #\n # .. qmp-example::\n #\n #     <- { \"event\": \"GUEST_PVSHUTDOWN\",\n #          \"timestamp\": { \"seconds\": 1648245259, \"microseconds\": 893771 } }\n+#\n+# Since: 9.1\n ##\n { 'event': 'GUEST_PVSHUTDOWN' }\n \n@@ -655,8 +671,6 @@\n #\n # @flags: flags for `MemoryFailureAction`.\n #\n-# Since: 5.2\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"MEMORY_FAILURE\",\n@@ -665,6 +679,8 @@\n #                    \"flags\": { \"action-required\": false,\n #                               \"recursive\": false } },\n #          \"timestamp\": { \"seconds\": 1267061043, \"microseconds\": 959568 } }\n+#\n+# Since: 5.2\n ##\n { 'event': 'MEMORY_FAILURE',\n   'data': { 'recipient': 'MemoryFailureRecipient',\ndiff --git a/qapi/tpm.json b/qapi/tpm.json\nindex 3f2850a5733..03c624e1ab8 100644\n--- a/qapi/tpm.json\n+++ b/qapi/tpm.json\n@@ -29,12 +29,14 @@\n #\n # Return a list of supported TPM models\n #\n-# Since: 1.5\n+# Details:\n #\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-tpm-models\" }\n #     <- { \"return\": [ \"tpm-tis\", \"tpm-crb\", \"tpm-spapr\" ] }\n+#\n+# Since: 1.5\n ##\n { 'command': 'query-tpm-models', 'returns': ['TpmModel'],\n   'if': 'CONFIG_TPM' }\n@@ -58,12 +60,14 @@\n #\n # Return a list of supported TPM types\n #\n-# Since: 1.5\n+# Details:\n #\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-tpm-types\" }\n #     <- { \"return\": [ \"passthrough\", \"emulator\" ] }\n+#\n+# Since: 1.5\n ##\n { 'command': 'query-tpm-types', 'returns': ['TpmType'],\n   'if': 'CONFIG_TPM' }\n@@ -164,7 +168,7 @@\n #\n # Return information about the TPM device\n #\n-# Since: 1.5\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -183,6 +187,8 @@\n #            }\n #          ]\n #        }\n+#\n+# Since: 1.5\n ##\n { 'command': 'query-tpm', 'returns': ['TPMInfo'],\n   'if': 'CONFIG_TPM' }\ndiff --git a/qapi/trace.json b/qapi/trace.json\nindex de369dae6b5..63685b3d5ec 100644\n--- a/qapi/trace.json\n+++ b/qapi/trace.json\n@@ -51,13 +51,13 @@\n #\n # Returns: a list of info for the matching events\n #\n-# Since: 2.2\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"trace-event-get-state\",\n #          \"arguments\": { \"name\": \"qemu_memalign\" } }\n #     <- { \"return\": [ { \"name\": \"qemu_memalign\", \"state\": \"disabled\", \"vcpu\": false } ] }\n+#\n+# Since: 2.2\n ##\n { 'command': 'trace-event-get-state',\n   'data': {'name': 'str' },\n@@ -74,13 +74,13 @@\n #\n # @ignore-unavailable: Do not match unavailable events with @name.\n #\n-# Since: 2.2\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"trace-event-set-state\",\n #          \"arguments\": { \"name\": \"qemu_memalign\", \"enable\": true } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.2\n ##\n { 'command': 'trace-event-set-state',\n   'data': {'name': 'str', 'enable': 'bool', '*ignore-unavailable': 'bool' } }\ndiff --git a/qapi/transaction.json b/qapi/transaction.json\nindex 4b4eb09bf38..1e6b5d37980 100644\n--- a/qapi/transaction.json\n+++ b/qapi/transaction.json\n@@ -244,8 +244,6 @@\n #    in an error condition, and subsequent actions will not have been\n #    attempted.\n #\n-# Since: 1.1\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"transaction\",\n@@ -266,6 +264,8 @@\n #                                          \"device\": \"ide-hd2\",\n #                                          \"name\": \"snapshot0\" } } ] } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.1\n ##\n { 'command': 'transaction',\n   'data': { 'actions': [ 'TransactionAction' ],\ndiff --git a/qapi/ui.json b/qapi/ui.json\nindex e3da77632a8..535e329e77c 100644\n--- a/qapi/ui.json\n+++ b/qapi/ui.json\n@@ -83,13 +83,13 @@\n # Errors:\n #     - If Spice is not enabled, DeviceNotFound\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"set_password\", \"arguments\": { \"protocol\": \"vnc\",\n #                                                    \"password\": \"secret\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'set_password', 'boxed': true, 'data': 'SetPasswordOptions' }\n \n@@ -145,13 +145,13 @@\n #     - If @protocol is 'spice' and Spice is not active,\n #       DeviceNotFound\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"expire_password\", \"arguments\": { \"protocol\": \"vnc\",\n #                                                       \"time\": \"+60\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'expire_password', 'boxed': true, 'data': 'ExpirePasswordOptions' }\n \n@@ -187,13 +187,13 @@\n #\n # @format: image format for `screendump`.  (default: ppm) (Since 7.1)\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"screendump\",\n #          \"arguments\": { \"filename\": \"/tmp/image\" } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'screendump',\n   'data': {'filename': 'str', '*device': 'str', '*head': 'int',\n@@ -328,7 +328,7 @@\n #\n # Return information about the current SPICE server\n #\n-# Since: 0.14\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -364,6 +364,8 @@\n #              ]\n #           }\n #        }\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-spice', 'returns': 'SpiceInfo',\n   'if': 'CONFIG_SPICE' }\n@@ -377,8 +379,6 @@\n #\n # @client: client information\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     <- { \"timestamp\": {\"seconds\": 1290688046, \"microseconds\": 388707},\n@@ -387,6 +387,8 @@\n #            \"server\": { \"port\": \"5920\", \"family\": \"ipv4\", \"host\": \"127.0.0.1\"},\n #            \"client\": {\"port\": \"52873\", \"family\": \"ipv4\", \"host\": \"127.0.0.1\"}\n #        }}\n+#\n+# Since: 0.14\n ##\n { 'event': 'SPICE_CONNECTED',\n   'data': { 'server': 'SpiceBasicInfo',\n@@ -403,8 +405,6 @@\n #\n # @client: client information\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     <- { \"timestamp\": {\"seconds\": 1290688046, \"microseconds\": 417172},\n@@ -415,6 +415,8 @@\n #                              \"connection-id\": 1804289383, \"host\": \"127.0.0.1\",\n #                              \"channel-id\": 0, \"tls\": true}\n #        }}\n+#\n+# Since: 0.14\n ##\n { 'event': 'SPICE_INITIALIZED',\n   'data': { 'server': 'SpiceServerInfo',\n@@ -430,8 +432,6 @@\n #\n # @client: client information\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     <- { \"timestamp\": {\"seconds\": 1290688046, \"microseconds\": 388707},\n@@ -440,6 +440,8 @@\n #            \"server\": { \"port\": \"5920\", \"family\": \"ipv4\", \"host\": \"127.0.0.1\"},\n #            \"client\": {\"port\": \"52873\", \"family\": \"ipv4\", \"host\": \"127.0.0.1\"}\n #        }}\n+#\n+# Since: 0.14\n ##\n { 'event': 'SPICE_DISCONNECTED',\n   'data': { 'server': 'SpiceBasicInfo',\n@@ -451,12 +453,14 @@\n #\n # Emitted when SPICE migration has completed\n #\n-# Since: 1.3\n+# Details:\n #\n # .. qmp-example::\n #\n #     <- { \"timestamp\": {\"seconds\": 1290688046, \"microseconds\": 417172},\n #          \"event\": \"SPICE_MIGRATE_COMPLETED\" }\n+#\n+# Since: 1.3\n ##\n { 'event': 'SPICE_MIGRATE_COMPLETED',\n   'if': 'CONFIG_SPICE' }\n@@ -658,7 +662,7 @@\n #\n # Return information about the current VNC server\n #\n-# Since: 0.14\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -679,6 +683,8 @@\n #              ]\n #           }\n #        }\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-vnc', 'returns': 'VncInfo',\n   'if': 'CONFIG_VNC' }\n@@ -700,11 +706,11 @@\n #\n # @password: the new password to use with VNC authentication\n #\n-# Since: 1.1\n-#\n # .. note:: An empty password in this command will set the password to\n #    the empty string.  Existing clients are unaffected by executing\n #    this command.\n+#\n+# Since: 1.1\n ##\n { 'command': 'change-vnc-password',\n   'data': { 'password': 'str' },\n@@ -722,8 +728,6 @@\n # .. note:: This event is emitted before any authentication takes\n #    place, thus the authentication ID is not provided.\n #\n-# Since: 0.13\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"VNC_CONNECTED\",\n@@ -733,6 +737,8 @@\n #                \"client\": { \"family\": \"ipv4\", \"service\": \"58425\",\n #                            \"host\": \"127.0.0.1\", \"websocket\": false } },\n #          \"timestamp\": { \"seconds\": 1262976601, \"microseconds\": 975795 } }\n+#\n+# Since: 0.13\n ##\n { 'event': 'VNC_CONNECTED',\n   'data': { 'server': 'VncServerInfo',\n@@ -749,8 +755,6 @@\n #\n # @client: client information\n #\n-# Since: 0.13\n-#\n # .. qmp-example::\n #\n #     <-  { \"event\": \"VNC_INITIALIZED\",\n@@ -760,6 +764,8 @@\n #                \"client\": { \"family\": \"ipv4\", \"service\": \"46089\", \"websocket\": false,\n #                            \"host\": \"127.0.0.1\", \"sasl_username\": \"luiz\" } },\n #           \"timestamp\": { \"seconds\": 1263475302, \"microseconds\": 150772 } }\n+#\n+# Since: 0.13\n ##\n { 'event': 'VNC_INITIALIZED',\n   'data': { 'server': 'VncServerInfo',\n@@ -775,8 +781,6 @@\n #\n # @client: client information\n #\n-# Since: 0.13\n-#\n # .. qmp-example::\n #\n #     <- { \"event\": \"VNC_DISCONNECTED\",\n@@ -786,6 +790,8 @@\n #                \"client\": { \"family\": \"ipv4\", \"service\": \"58425\", \"websocket\": false,\n #                            \"host\": \"127.0.0.1\", \"sasl_username\": \"luiz\" } },\n #          \"timestamp\": { \"seconds\": 1262976601, \"microseconds\": 975795 } }\n+#\n+# Since: 0.13\n ##\n { 'event': 'VNC_DISCONNECTED',\n   'data': { 'server': 'VncServerInfo',\n@@ -825,8 +831,6 @@\n #\n # Returns: a list of info for each device\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"query-mice\" }\n@@ -845,6 +849,8 @@\n #              }\n #           ]\n #        }\n+#\n+# Since: 0.14\n ##\n { 'command': 'query-mice', 'returns': ['MouseInfo'] }\n \n@@ -1035,8 +1041,6 @@\n # Errors:\n #     - If key is unknown or redundant, GenericError\n #\n-# Since: 1.3\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"send-key\",\n@@ -1044,6 +1048,8 @@\n #                                   { \"type\": \"qcode\", \"data\": \"alt\" },\n #                                   { \"type\": \"qcode\", \"data\": \"delete\" } ] } }\n #     <- { \"return\": {} }\n+#\n+# Since: 1.3\n ##\n { 'command': 'send-key',\n   'data': { 'keys': ['KeyValue'], '*hold-time': 'int' } }\n@@ -1265,8 +1271,6 @@\n #\n # @events: List of `InputEvent` union.\n #\n-# Since: 2.6\n-#\n # .. note:: The consoles are visible in the qom tree, under\n #    ``/backend/console[$index]``.  They have a device link and head\n #    property, so it is possible to map which console belongs to which\n@@ -1308,6 +1312,8 @@\n #                    { \"type\": \"abs\", \"data\" : { \"axis\": \"x\", \"value\" : 20000 } },\n #                    { \"type\": \"abs\", \"data\" : { \"axis\": \"y\", \"value\" : 400 } } ] } }\n #     <- { \"return\": {} }\n+#\n+# Since: 2.6\n ##\n { 'command': 'input-send-event',\n   'data': { '*device': 'str',\n@@ -1620,13 +1626,15 @@\n #\n # Reload display configuration.\n #\n-# Since: 6.0\n+# Details:\n #\n # .. qmp-example::\n #\n #     -> { \"execute\": \"display-reload\",\n #          \"arguments\": { \"type\": \"vnc\", \"tls-certs\": true  } }\n #     <- { \"return\": {} }\n+#\n+# Since: 6.0\n ##\n { 'command': 'display-reload',\n   'data': 'DisplayReloadOptions',\n@@ -1677,7 +1685,7 @@\n #\n # Update display configuration.\n #\n-# Since: 7.1\n+# Details:\n #\n # .. qmp-example::\n #\n@@ -1686,6 +1694,8 @@\n #                         [ { \"type\": \"inet\", \"host\": \"0.0.0.0\",\n #                             \"port\": \"5901\" } ] } }\n #     <- { \"return\": {} }\n+#\n+# Since: 7.1\n ##\n { 'command': 'display-update',\n   'data': 'DisplayUpdateOptions',\n@@ -1708,8 +1718,6 @@\n #\n # @cert-subject: server certificate subject\n #\n-# Since: 0.14\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"client_migrate_info\",\n@@ -1717,6 +1725,8 @@\n #                         \"hostname\": \"virt42.lab.kraxel.org\",\n #                         \"port\": 1234 } }\n #     <- { \"return\": {} }\n+#\n+# Since: 0.14\n ##\n { 'command': 'client_migrate_info',\n   'data': { 'protocol': 'str', 'hostname': 'str', '*port': 'int',\ndiff --git a/qapi/vfio.json b/qapi/vfio.json\nindex 17b60468712..630e2595c82 100644\n--- a/qapi/vfio.json\n+++ b/qapi/vfio.json\n@@ -58,8 +58,6 @@\n #\n # @device-state: The new changed device migration state.\n #\n-# Since: 9.1\n-#\n # .. qmp-example::\n #\n #     <- { \"timestamp\": { \"seconds\": 1713771323, \"microseconds\": 212268 },\n@@ -68,6 +66,8 @@\n #              \"device-id\": \"vfio_dev1\",\n #              \"qom-path\": \"/machine/peripheral/vfio_dev1\",\n #              \"device-state\": \"stop\" } }\n+#\n+# Since: 9.1\n ##\n { 'event': 'VFIO_MIGRATION',\n   'data': {\ndiff --git a/qapi/virtio.json b/qapi/virtio.json\nindex 447fc182625..ae795e1e852 100644\n--- a/qapi/virtio.json\n+++ b/qapi/virtio.json\n@@ -34,8 +34,6 @@\n #\n # @unstable: This command is meant for debugging.\n #\n-# Since: 7.2\n-#\n # .. qmp-example::\n #\n #     -> { \"execute\": \"x-query-virtio\" }\n@@ -62,6 +60,8 @@\n #              }\n #          ]\n #        }\n+#\n+# Since: 7.2\n ##\n { 'command': 'x-query-virtio',\n   'returns': [ 'VirtioInfo' ],\n@@ -203,8 +203,6 @@\n #\n # @unstable: This command is meant for debugging.\n #\n-# Since: 7.2\n-#\n # .. qmp-example::\n #    :annotated:\n #\n@@ -437,6 +435,8 @@\n #              \"use-started\": true\n #          }\n #        }\n+#\n+# Since: 7.2\n ##\n { 'command': 'x-query-virtio-status',\n   'data': { 'path': 'str' },\n@@ -579,8 +579,6 @@\n #    shadow_avail_idx will not be displayed in the case where the\n #    selected VirtIODevice has a running vhost device.\n #\n-# Since: 7.2\n-#\n # .. qmp-example::\n #    :annotated:\n #\n@@ -635,6 +633,8 @@\n #              \"vring-num\": 128\n #          }\n #        }\n+#\n+# Since: 7.2\n ##\n { 'command': 'x-query-virtio-queue-status',\n   'data': { 'path': 'str', 'queue': 'uint16' },\n@@ -707,8 +707,6 @@\n #\n # @unstable: This command is meant for debugging.\n #\n-# Since: 7.2\n-#\n # .. qmp-example::\n #    :title: Get vhost_virtqueue status for vhost-crypto\n #\n@@ -756,6 +754,8 @@\n #              \"kick\": 0\n #          }\n #        }\n+#\n+# Since: 7.2\n ##\n { 'command': 'x-query-virtio-vhost-queue-status',\n   'data': { 'path': 'str', 'queue': 'uint16' },\n@@ -854,8 +854,6 @@\n #\n # @unstable: This command is meant for debugging.\n #\n-# Since: 7.2\n-#\n # .. qmp-example::\n #    :title: Introspect on virtio-net's VirtQueue 0 at index 5\n #\n@@ -943,6 +941,8 @@\n #              }\n #          }\n #        }\n+#\n+# Since: 7.2\n ##\n { 'command': 'x-query-virtio-queue-element',\n   'data': { 'path': 'str', 'queue': 'uint16', '*index': 'uint16' },\n","prefixes":["v2","09/10"]}