Re: [regext] Extension Prefixes, JSON Values, and URI Path Segments

Tom Harrison <tomh@apnic.net> Mon, 30 May 2022 11:55 UTC

Return-Path: <tomh@apnic.net>
X-Original-To: regext@ietfa.amsl.com
Delivered-To: regext@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id EB6EBC14CF17 for <regext@ietfa.amsl.com>; Mon, 30 May 2022 04:55:48 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.71
X-Spam-Level:
X-Spam-Status: No, score=-1.71 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_INVALID=0.1, DKIM_SIGNED=0.1, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01, URIBL_BLOCKED=0.001] autolearn=no autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=fail (1024-bit key) reason="fail (body has been altered)" header.d=apnic.net
Received: from mail.ietf.org ([50.223.129.194]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 3NgztYCD7vAm for <regext@ietfa.amsl.com>; Mon, 30 May 2022 04:55:44 -0700 (PDT)
Received: from AUS01-SY4-obe.outbound.protection.outlook.com (mail-sy4aus01on2061c.outbound.protection.outlook.com [IPv6:2a01:111:f403:7005::61c]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 43CE0C15C004 for <regext@ietf.org>; Mon, 30 May 2022 04:55:43 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Wn/0SQ4XXT4vHU4UhFj7Z1GNXzBg1XlQG56yinJW66ByBqpKIKZN/wnapWD09MkxD01M7oC+3PWT9Lfwt0YOh0KC8KTsq73jN5lrKBo8npl5W14OOEwAw5/oKqLHm7Ug31Yu+2V8j1KXve+YvO8IfSTeuTP7vhqkQILDVMqytzyQX9btSOKqp+Hutto/PMJJgeoDpWWSE+pMCpYQu5AUb/ydHQMN8wKEk/hZ+vTd1epZMQTuuD6Sw/1dHC6TZyo3m1JvPTZZKqxkAbDFPJUiXFImg/cjOIozNuHbCENxqbGKruI+HUW6sw8CXmvjDx2QzK0dnlrKd9OeUdkamE1Spw==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=5Y5732K7sE3v0eOYyyu2rZq8cVQpdOHQYaQztQo0yuY=; b=JUPAPAeb+r5BzzceSIjd6T7zwBfb0s3Fb4TWSFsccz+kjY3Kw427Ra7SGrhJekv6KETBJGgJ1Gyvh1GPp+/c4hpJ6+YOISdhGchVgN6IxG61Nz2uJ96rosoMTZvoDifoDHEEvf5kk0AusTo8Zobqm42TIknGRBxGWXT/vUEUv0e8uZiJgwavan/zoJJj8gVdKrlBea8Wv9VIPBj5i5jGLbQbmjB3evNkuyJdJj77V3XxLgwLi3Gxj5Zr+NCSSG4AIx4GfEA60rQlvs+iw4Yls1++6nc1K9oPIcQ6Hhekfjo8g+uFcRkyWPKAWnY78J/tieZzcD/Dxg3ba1wh9rp3FA==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=apnic.net; dmarc=pass action=none header.from=apnic.net; dkim=pass header.d=apnic.net; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=apnic.net; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5Y5732K7sE3v0eOYyyu2rZq8cVQpdOHQYaQztQo0yuY=; b=ZZlXro4PPSkPi+sP5DT3JjbA9HrTC6zMAMxtPVBXry272a2YkULxiooqjacqrFVgjdMOefy2JOUiObrhULIp7hGVvoqrA2twg5i9E2kTwfiIUcXPQ+RWPyvzByQ1hnClNGi3vZLU9WwSi0JRBeoCG+GKjr93Q1cgl1/Y9RGo07I=
Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=apnic.net;
Received: from SYBP282MB0553.AUSP282.PROD.OUTLOOK.COM (2603:10c6:10:68::12) by ME4P282MB1128.AUSP282.PROD.OUTLOOK.COM (2603:10c6:220:96::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5293.13; Mon, 30 May 2022 11:55:33 +0000
Received: from SYBP282MB0553.AUSP282.PROD.OUTLOOK.COM ([fe80::4d8f:bd0d:749c:bf8e]) by SYBP282MB0553.AUSP282.PROD.OUTLOOK.COM ([fe80::4d8f:bd0d:749c:bf8e%3]) with mapi id 15.20.5293.019; Mon, 30 May 2022 11:55:33 +0000
Date: Mon, 30 May 2022 21:55:30 +1000
From: Tom Harrison <tomh@apnic.net>
To: Mario Loffredo <mario.loffredo@iit.cnr.it>
Cc: "Hollenbeck, Scott" <shollenbeck=40verisign.com@dmarc.ietf.org>, "Gould, James" <jgould@verisign.com>, "regext@ietf.org" <regext@ietf.org>
Message-ID: <YpSwsreotdqaTCmU@TomH-802418>
Mail-Followup-To: Mario Loffredo <mario.loffredo@iit.cnr.it>, "Hollenbeck, Scott" <shollenbeck=40verisign.com@dmarc.ietf.org>, "Gould, James" <jgould@verisign.com>, "regext@ietf.org" <regext@ietf.org>
References: <3EE8519B-CEFE-4DEB-9E43-F68DCA446BBB@verisign.com> <84c5706314a248df80af5c14802acf51@verisign.com> <AED70457-5263-4F08-8500-08C027912EF2@verisign.com> <b0683ce9a5c6447c9c9be8741b9d9cf5@verisign.com> <fbd37e63-b179-9a14-dffe-3082ab1edfa0@iit.cnr.it> <Yo6uz05Oc5iKvoee@TomH-802418> <65427a66-7149-26e4-ae79-88966a36d89e@iit.cnr.it> <YpL5uqGP+RHVKTEM@TomH-802418> <19e87e0b-ea27-ef0b-18cf-ad61a5dcacec@iit.cnr.it>
Content-Type: text/plain; charset="iso-8859-1"
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <19e87e0b-ea27-ef0b-18cf-ad61a5dcacec@iit.cnr.it>
X-ClientProxiedBy: SYBPR01CA0140.ausprd01.prod.outlook.com (2603:10c6:10:5::32) To SYBP282MB0553.AUSP282.PROD.OUTLOOK.COM (2603:10c6:10:68::12)
MIME-Version: 1.0
X-MS-PublicTrafficType: Email
X-MS-Office365-Filtering-Correlation-Id: 70d02fdf-9082-4d45-c064-08da42334d52
X-MS-TrafficTypeDiagnostic: ME4P282MB1128:EE_
X-Microsoft-Antispam-PRVS: <ME4P282MB1128C6E2391FC08140ABC235C0DD9@ME4P282MB1128.AUSP282.PROD.OUTLOOK.COM>
X-MS-Exchange-SenderADCheck: 1
X-MS-Exchange-AntiSpam-Relay: 0
X-Microsoft-Antispam: BCL:0;
X-Microsoft-Antispam-Message-Info: KHyDWM7hTFx2DrAf/j6Ep5km7ZF4xpJ03dMGFCBKJ+vwFwtQqANoE99Xgof7/YU+GGnx6CLLqT+6Jysw2sDcT/E+16y7ygiaFaTcpHQtrGpk+mcnTfivvQa7b/c+HaA3xLjgO1D5MJC4k/T5GPMKmUltQHex67DBrVOYsp8WFZKpVURDJomfYNAR8h4RpuUYTuMDsudXC8QU9UsPAi9PCv9DpONipzyYVkQt0uUZX4/rqQOmMuSh2OVLKTvLfK0f6MR55hFseRjCyE8oEnOPtAIQgOnAI7O21Y3J2H66QGPt+vFCf+2PaxlWFAjLkZM6JLqm2Ihhfq0mg1ynlzHo0DhGOra8u4jP4kPsw4XAFFTYykG+vnc5gPmw86mvw3Cmelm3/UJWZikP1XWGrNHQnFWsXWVrFhvz82TY90nZRiU4RPuTr6Rso6y0yte2fqRtXorU0qBSlTbzHMbK0Ng4Uk0nKRtiPA8AUGedxY8WnBE6QFbQ7agZb4lBcwKWdBbci96j+IZOv17NQS4S/K5iyiCKrlh9FPF3VBnm+2RAM/KMpwb/DSKfeVic4wmKurasmg1Ekg2K/FZFsB/diDiaoTwS2J4eaTUjhBPELYBlLpa8OAqzlKrKcfWMufIqcQcUKXgiFuS76cZ32f00U9E40jiIem591uVmTQZUdnlvQOqf+jsJ3CgYQlplbdZGNGbv4acV+etN8rh+Q7eOuP65jhDtQD8C6J8RP3N4xo9nIevaguBc3nkJFoxYQZl76YjKaqd2lBAj1p/Hdi1z7eYgLjYLTPTYALryFzBCqPDyPMI=
X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SYBP282MB0553.AUSP282.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(13230001)(7916004)(4636009)(136003)(346002)(366004)(396003)(376002)(39840400004)(6512007)(6506007)(9686003)(8936002)(83380400001)(26005)(30864003)(86362001)(5660300002)(316002)(508600001)(54906003)(38100700002)(41300700001)(6916009)(52116002)(66556008)(66476007)(33716001)(66946007)(2906002)(966005)(6486002)(8676002)(186003)(38350700002)(4326008); DIR:OUT; SFP:1101;
X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1
X-MS-Exchange-AntiSpam-MessageData-0: Oph6CmwnWQuLnT8e1ZJg4NjgS0KNIlg6zVLI9oIwXo+ucdLhuxCvi09hF3HlZng7YXShEOLmnabcit8jMjARi1GEy5sLG4C0DT18xKqCnBqfiMt7r41ALg/JGuD2Rts9gnGu24jWr6N6gFkvHDxEfzgfhk/V0Q6Di4+pkktSVCItIhNjPjglJ/B7RKfgU2UVYOSOpp/LZ3f2sfhNoo3DriauvCZikRaMWZf24Z4UppBxU+rN4fNucDCQ3EEs/AmL2NF2wPa+iN0vg1C+ZGyjefxaAi87jt3pxuKJt1SuFom4YGc337SHXcBlhbZ7ItpPlgevx73BfqHY/H/LCrONj2l9pH3VX0SeB36GZoAAcyCe0HAGlIVY05hbBv52E3MFijIOc5lr9u8RmkQvjXQBKLhhXax1YhxVLxQ9fkc6ZkPQXLTI4yOePvFzcLPHLp5jH8LEZ/BHhyCTmueoXq79rgSqPCH1znYYeOM+Gyqdz5dIIpWjZo+MoQY+eCSJSa+6UY9l7sNRjd19W6FGqpQmguL3DZ9PeFp0zQsGXVd8Ra8xmEZX3Mj+XxkbsO2RItGQ7s6ZwGElRS6OA3iaBHly7lBT8FbgCKNe3l+n06aHkFgRtHGNlBPAWpD1YYZD08kYGlSQGzE3iINOHKtGCYN/HamcIpEpcRu26ZP7Q/ZXvYjUaYquhonGhLgTqNwpfowo2lbZGP+Gu6laAETmeE/KLlU3Ot8ZibaPdK4H3A6deNLvpl5vpI8i6UAieNq56knWksLrCTdseSnTOEp0NDKVLCCxc1pjuQVSL9mYDKi/RilKQarbTyOuH9r7K262Q9i5cncyaITXHOPe3372vbHMP7/pRGI7NWggZ9jFSp706Emj4cWbDWuqyniyue3vTgNqZznAgr5jbOUn+wIMCpBtypfM0v+VY9CijIk/fxymV9AOEvdRtcU4LfaqC5XhZHdDHRN8kULtsrV5FnpAD5VFqFLfgDD/S/MRQuJILA8gKXT1QxlzluukWUcknC9wv0rOgsnbLEsI2STJxQwCHlf3dPn+2W4CN839VaRMMJFUa3oLFFJZtyfD5ZmVkHZFyUMFms+teVQ54lwAZQngh8fANLFuojRUW/6oUieDlcrAg2PVBZsMCMPeYowpco8qDaWPUYuUBDxUyhZwGL2cDoN7pPBSyDx3d+HQEW2MNymsTvsz4STQ4d4rdJ1aHT3wa4dlBeX6/yDXVlBdUWOoYP1p6WaoOZf9P9OfNcOl34yx5SboBWFBQreZapZ9HR3+jAAwiCnFK+VxFvOhsp2NeBZZLR/A6AJlgic1JNG16FalHQ13vvwyk1JlWYn/p5Y6aICHd8BYxdCdVdDN7QUi8j1G1d2VRAAW5veoDYhDTMgNT40o8y2LecnGp2zSM5AtxGakA0txXDFINA7NHF3YUIJIBDvK3TUq76FpEfbNm8795HjkM99+uOJ107ft22+0aDKn1olF8AstyvBpFOPYt7sSxK3qhdjIYnk067/D0sRTf3W4Q5nNr8Qsf/ZMvNkn0oofGCkVw/Fd7pMqMXJS+6MRKsk1ImjdLxuCf9ZBYu28cQSQy68CtzRKsMmmelTqZc4EdctShC8QkjploF0kamHLWIbRE6faz+Um38aWyJ1SGyWUTF9AOx5j+fjm/UTLmJhZfZX3nltixcqv78XqRnXuKiyzHQYKsHNhFdHVS+OVqzTOHqxwhwroAmRFQJghRl0oc2KBfqb6KwhBLqMvGEIwhw==
X-OriginatorOrg: apnic.net
X-MS-Exchange-CrossTenant-Network-Message-Id: 70d02fdf-9082-4d45-c064-08da42334d52
X-MS-Exchange-CrossTenant-AuthSource: SYBP282MB0553.AUSP282.PROD.OUTLOOK.COM
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2022 11:55:33.5786 (UTC)
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-CrossTenant-Id: 127d8d0d-7ccf-473d-ab09-6e44ad752ded
X-MS-Exchange-CrossTenant-MailboxType: HOSTED
X-MS-Exchange-CrossTenant-UserPrincipalName: lvLmC+3Bv8sRGeNIIp8IpUsZqoFOu1batU9uIAniYeaXNtYcZ3F/0B5oySp6R5TW
X-MS-Exchange-Transport-CrossTenantHeadersStamped: ME4P282MB1128
Archived-At: <https://mailarchive.ietf.org/arch/msg/regext/2Qk20566uqzzTLJe1jCN0j6XnSw>
Subject: Re: [regext] Extension Prefixes, JSON Values, and URI Path Segments
X-BeenThere: regext@ietf.org
X-Mailman-Version: 2.1.34
Precedence: list
List-Id: Registration Protocols Extensions <regext.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/regext>, <mailto:regext-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/regext/>
List-Post: <mailto:regext@ietf.org>
List-Help: <mailto:regext-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/regext>, <mailto:regext-request@ietf.org?subject=subscribe>
X-List-Received-Date: Mon, 30 May 2022 11:55:49 -0000

Hi Mario,

On Mon, May 30, 2022 at 09:51:21AM +0200, Mario Loffredo wrote:
> Il 29/05/2022 06:42, Tom Harrison ha scritto:
>> On Fri, May 27, 2022 at 12:41:27PM +0200, Mario Loffredo wrote:
>>> Think the matter is that even the possible backwards-compatible changes
>>> would result in being hardly backwards-compatible.
>>> 
>>> Let te me give an example to make myself clear and move the discussion on a
>>> practical perspective.
>>> 
>>> Let's call "ext1" the rdapConformance value signaling the support of
>>> "ext1_data" response extension. The response would be:
>>> 
>>> {
>>> 
>>> "rdapConformance" : [ ....., "ext1"],
>>> 
>>> ...
>>> "ext1_data" : { ... },
>>> ....
>>> 
>>> }
>>> 
>>> Now, let's suppose to add the field "newfield" to "ext1_data" and signal
>>> this change by a version update from "ext1" to "ext2". The response should
>>> be (in theory):
>>> 
>>> {
>>> 
>>> "rdapConformance" [ ....., "ext2"],
>>> 
>>> ...
>>> 
>>> "ext2_data" : { ... },   // where ext2_data includes all the member of
>>> "ext1_data" plus "newfield"
>>> ....
>>> 
>>> }
>>> 
>>> To avoid a breakage in the REST contract, the RDAP server should implement a
>>> deprecation process ending with the replacement of "ext1_data" with
>>> "ext2_data". This means that, for a period of time, both the version of the
>>> response extensions should be provided:
>>> 
>>> {
>>> 
>>> "rdapConformance" [ ....., "ext1", "ext2"],
>>> 
>>> ...
>>> "ext1_data" : { ... },
>>> "ext2_data" : { ... },
>>> ....
>>> 
>>> }
>>> 
>>> 
>>> This situation would result in the following paradox as well: being the
>>> introduction of new field in a JSON response widely considered a non
>>> breaking change, it should be signaled by a minor version update (e.g.
>>> "ext1_1). But, since the final effect would be the replacement of a response
>>> field with another,  a major version change should be used instead. In
>>> short, every new version of the response extension would imply a major
>>> version update ("ext1", "ext2", "ext3", ..) and  a consequent deprecation
>>> process the server should support.
>> 
>> I don't understand the relevance of the scenario given above to the
>> approach I set out for handing backwards-compatible changes.  To avoid
>> any doubt about the models I was proposing, I'll step through them in
>> more detail, per your approach above.
>> 
>>   - Scenario A: add single field (backwards-compatible):
>>      - Initial: register extension "ext1", which notes that "ext1_data"
>>        will be included in responses, with a single field named
>>        "field1":
>> 
>>          "rdapConformance": [ ..., "ext1" ],
>>          ...
>>          "ext1_data": { "field1": ... }
>> 
>>      - Later: update the existing registration for extension "ext1",
>>        noting that some implementations of this extension may now
>>        return "field2".  Implementations in accordance with the
>>        original version of "ext1" continue working as they do today.
>>        Implementations in accordance with the new version of "ext1"
>>        return responses like so:
>> 
>>          "rdapConformance": [ ..., "ext1" ],
>>          ...
>>          "ext1_data": { "field1": ...,
>>                         "field2": ... }
>> 
>>      - The presence of "field2" is enough to distinguish the new
>>        version from the original version.  Clients written to work with
>>        the original version do not change, and clients written to work
>>        with the new version are also fine, because they can determine
>>        whether the new version has been implemented by way of the
>>        presence of "field2".
> 
> [ML] Usually, REST-JSON consumers configure JSON libraries to ignore unknown
> fields in deserialization. This just to reduce to prevent from breaking
> changes in responses.
> 
> Hence, the presence of "field2" wouldn't be detected unless it was managed
> by the client (e.g. by putting every unknown field on a given map).

I'm not sure how this is different from what I wrote.  A client
configured in this way is one that works against the original version
only, which is fine.  If/when the client is updated to support the new
version, then it can make use of the new field.

>>   - Scenario B: add multiple fields (backwards-compatible):
>>      - Initial: register extension "ext1", which notes that "ext1_data"
>>        will be included in responses, with a single field named
>>        "field1".  Subversioning is managed by way of an additional
>>        "conformance" field, which is used to note minor
>>        (backwards-compatible) updates:
>> 
>>          "rdapConformance": [ ..., "ext1" ],
>>          ...
>>          "ext1_data": { "conformance": "ext1",
>>                         "field1": ... }
>> 
>>      - Later: update the existing registration for extension "ext1",
>>        noting that a new "ext1_data.conformance" value of "ext1_1" may
>>        be used, implementations of which will return "field2" and
>>        "field3" in the "ext1_data" element.  Implementations in
>>        accordance with the original version of "ext1" continue working
>>        as they do today.  Implementations in accordance with the new
>>        version of "ext1" return responses like so:
>> 
>>          "rdapConformance": [ ..., "ext1" ],
>>          ...
>>          "ext1_data": { "conformance": "ext1_1",
>>                         "field1": ...,
>>                         "field2": ...,
>>                         "field3": ... }
>> 
>>      - The "ext1_data.conformance" field is enough to distinguish the
>>        new version from the original version.  Clients written to work
>>        with the original version do not change, and clients written to
>>        work with the new version are also fine, because they can
>>        inspect at the "conformance" field.
> 
> [ML]  As a  consequence of this scenario,  every RDAP response extension
> should include a fixed property named "conformance".

Not necessarily.  An extension author might decide that the chance of
change is so low that they don't see the need to incorporate this sort
of signalling into their specification.

> If this could be admissible for response extensions defined in the RDAP
> context, it couldn't fit for external specifications.
> 
> See JSContact for example. VCard itself is an external specification used
> for defining an RDAP response.

Wrapping the external specification object inside another object that
provides the version/conformance information for that wrapped object
seems like an adequate way to deal with this concern.

>> Backwards-incompatible changes continue to require a new top-level
>> "rdapConformance" value and a transition process where both
>> "ext1_data" and "ext2_data" (or their equivalents) are returned, per
>> the example you gave above.
> 
> [ML]  Both Scenario A and B seem to me requiring some additional effort from
> implementers. Can't understand why we should make more difficult what could
> be managed straightforwardly.
> 
> Think we should accomplish the solution requiring the lowest (to zero)
> implementation effort for both client and server. If this means that some
> RFCs must be corrected to clarify the extension mechanism and make it more
> straightforward, we should do it.

There are a few considerations here:

 - There appears to be general consensus that clarification of the
   extension mechanism in RDAP is required.  At one end, that
   clarification could restate the 'strict' model more clearly.  At
   the other, it might be something like James' "Approach C", from
   https://mailarchive.ietf.org/arch/msg/regext/e7hZPYUoD3GmjdGiC444TmrCsjg/.
 - The closer that clarification is to the current 'strict' model, the
   better (IMHO), since that will help to minimise change in existing
   RDAP clients.
 - If people are noting apparent limitations of the 'strict' model,
   then demonstrating that the limitations may not be so serious as
   initially thought may help with keeping something like the 'strict'
   model in place.

Of course, the consensus may be that more extensive change is
worthwhile notwithstanding that the 'strict' model can be made to
accommodate the various requirements that people are raising here.
However, I think it's useful all the same to talk about what can and
can't be done with that model today.

(The above is also relevant to the question of how the existing
documents should be interpreted, separately from a potential
clarifying document.  For example, if the 'strict' model meant that
backwards-compatible changes were as onerous as you posited, that
would be an argument in favour of an alternative reading.)

>> Again, my concern here is not to say that the above are ideal
>> mechanisms for versioning or similar, but simply to note that the
>> existing strict reading is not so fundamentally problematic that it
>> necessitates an alternative reading/approach.
> 
> [ML]  Maybe it isn't problematic but it seems a bit cumbersome to me.
> 
>>> A possible inelegant and misleading workaround would be to treat any new
>>> version as a new extension like in the following:
>>> 
>>> {
>>> 
>>> "rdapConformance" [ ....., "ext1", "newfield1"],
>>> 
>>> ...
>>> "ext1_data" : {
>>>                            ...
>>>                           "newfiled1" : { ... }
>>>                          },
>>> ....
>>> 
>>> }
>> 
>> If "newfield1" were named e.g. "ext1_1", I'm not sure that it would be
>> particularly misleading, at least on a current strict reading of the
>> text.
> 
> [ML] The example was based on the assumption that there should be a tight
> coupling between the name prefix of a new response extension and the
> rdapConformance value signaling the support for that extension.

Fair enough.  Scenario A is still an adequate way of dealing with the
concern here, I think.

>> It's probably fair to say that it's inelegant, but I think the
>> key thing about this contention between a strict reading and some
>> other potential reading is whether the strict reading is so
>> problematic that some other reading must have been intended, and I
>> don't think this (arguable) inelegance is so serious that that is the
>> case here.
> 
> [ML] The strict reading results in operational drawbacks that make the
> implementers' work harder.
> 
>>> Stripping the version information from the extension prefix (Approach B or
>>> C)  would simplify the management of this case:
>>> 
>>> {
>>> 
>>> "rdapConformance": [ ....., "ext_1_1"], // (or "ext_level_1_1") to be
>>> determined if the RDAP server should include both "ext_1" and "ext_1_1" at
>>> least for a period of time
>>> 
>>> ...
>>> "ext_data" : {
>>>                            ...
>>>                           "newfiled" : { ... }
>>>                          },
>>> ....
>>> 
>>> }
>>> 
>>> 
>>> Definitively, no breakages in the REST API contract, no deprecation process
>>> to be managed by the server, no extra effort for both client and server
>>> owing to the fact that JSON is schemeless and, by default, JSON libraries
>>> don't block the deserialization of an object including an unknown property.
>> 
>> The above example would require the extension author to document their
>> intent to occupy a namespace of sorts in the extension registry,
>> because otherwise a client written to operate against "ext_1" will not
>> know what to do when it encounters "ext_1_1" (i.e. it won't be
>> possible to make backwards-compatible changes).
> 
> [ML] Every change on a stable version implies the change needs to be
> documented and this is should be done regardless the approach defined to
> extend RDAP.
> 
> The presence of a minor version in the rdapConformance array would signal
> the clients that a non breaking change have been introduced either in the
> request or in the response.
> 
> Client implementers could take all their time to gather information about
> that change and then update their client being confident that, in the
> meantime, it would keep working.
> 
>> The idea of an
>> extension declaring ownership of a namespace is at odds with the text
>> in 9083 about extensions being identified by "a unique string literal
>> value registered in the IANA RDAP Extensions registry", too.  Given
>> that, I'm not sure that it would be open to take this approach with
>> the text as it stands.
> 
> [ML] I intended that you, like some others in this WG, agreed that current
> RFCs should be corrected to clarify the argument.
> 
> The "conformance" property itself should be defined and such a definition
> should be harmonized with the current RFCs.
> 
> If we agree that the RDAP extension mechanism must be reviewed, let's define
> a new one that doesn't introduce ambiguities, drawbacks and is the easiest
> to be implemented.

Per your comments, I was concerned to note that this proposed approach
would not work as against the current text, rather than that it was a
bad idea in the context of a broader rethinking of extensions in RDAP.

>>> A similar example is about adding a new optional query parameter to an URI
>>> path defined by a request extension.
>> 
>> I think scenario B that I set out previously (i.e. embed further
>> versioning information in the extension response) would work for this
>> aspect as well.
> 
> [ML] Sorry but I didn't catch it. Can you clarify how the presence of a new
> optional query parameter would be signaled in the response?

To work through another scenario:

 - Initial: register extension "ext1", which notes that the "help"
   response will include an additional "ext1_version" element
   describing the exact version of the specification being used
   (initially "1.0").  The extension also supports a new path,
   "/ext1_query".
 - Later: update the existing registration for extension "ext1",
   noting that "ext1_version" is now "2.0", and that the "/ext1_query"
   path now supports the new optional parameter.
 - Clients written to work with the original version do not change.
   Clients written to work with the new version can inspect the
   "ext1_version" field in order to determine whether the server
   supports the optional parameter.

> Anyway, don't see much difference between signaling by adding a new
> version in the rdapConformance array and signaling by introducing an
> ad-hoc response field.

The difference is that the ad hoc response field can be used with the
current 'strict' model.

-Tom