Defining the path forward #282
Replies: 8 comments 56 replies
-
Thanks, @gregsdennis . Can we have each core team member label their sheet (or sheets - I expect to use two) in the spreadsheet document with our github usernames? That will help us discuss the different state assessments. To capture a discussion point from yesterday's call, let's emphasize that what is "interim" about the "interim spec" is the process and format of publishing the spec. It will be a full, non-draft specification intended for regular use, and all stability guarantees will be real stability guarantees. Where the "interim" nature of this publication shows up with respect to stability is that it will be very conservative about guaranteeing stability. If the core team is not confident of something's stability, it will not yet be marked stable, even if it is a critically important part of JSON Schema. I'd like to add that since publishing a specification is the one thing that reliably provokes feedback from a broad range of implementers, users, and downstream specifications, that this interim publication will have an explicit goal of guiding readers to understand how these process changes will impact them, and how to ask questions provide feedback regarding such impacts. This does not mean adding a lot of editorializing into the specification itself, but might make use of the equivalent of CREFs, which we have used to set expectations regarding likely future changes in the past. In my view, the unresolved topics that we want to get feedback on by publishing this "interim" spec include but are not limited to:
This is in addition to the usual sort of possible schema changes. For example, we've long talked of a machine-readable vocabulary description file. Some of these might be closely related to process questions. Perhaps the most important thing is to figure out whether what we publish makes implementers more confident or less confident that implementing the latest spec will allow them to have a more stable and easily-updated architecture. The jump between draft-07 and 2019-09 involved significant architectural changes around annotation and error collection, as well as dynamic behavior at runtime. I believe some of @awwright 's changes could be similarly disruptive (for example, |
Beta Was this translation helpful? Give feedback.
-
I tend to agree that a “stable” specification should be prioritized. I’m also optimistic that there’s a straightforward path: While there’s many keywords that might be “unstable” or experimental, we can stabilize the media type definition independently of non-core keywords. This is the “stable core” approach: introducing those capitalized BCP 14 keywords so that newer features can be introduced and standardized, in a way that guarantees interoperability between implementations, and between publications of JSON Schema. You've hit upon a bit of a paradox: We want to stop saying "draft" because that scares people away from using JSON Schema implementations in production (which are themselves stable), but we haven't guaranteed that JSON Schema won't keep changing in incompatible ways in the future, so how can we call it "stable"? I'm not aware of a term halfway in between these two. (I think the "draft" term is appropriate, if misunderstood; most of my work for the past several years has been researching how to stabilize JSON Schema Core and publish a suitable media type definition). I've only casually mentioned what the "next step" is, so let me explain now: I think I'll file an issue to add in the "indeterminate" state that I discuss in my paper, to find consensus over the details, and then write up the changes and file a PR. As @handrews points out, the paper contains many different ideas that may or may not be any good, but I'll try to break them apart into different issues that can each go in or not, independently of each other, and I'll file these in series. I’ve been struggling to decide on a good starting point, there’s a few different issues that could all go first, but the “indeterminate result” is the most critical aspect of this. The reason to do this before anything else is once we have rigorous interoperability requirements, we will have a solid yardstick to judge which keywords are stable, and which changes would break implementations. Regarding the “publication mechanism”, I'm unsure how the current formatting impacts stability. The page on the website looks perfectly fine. And converting the formatting to Markdown is interesting, but hardly necessary. Can you describe how this helps stability, or is it just a nice feature to help editing? |
Beta Was this translation helpful? Give feedback.
-
On the discussion about how do we reach users at all stages of use, I've found this small guide a good way to think about framing the personas and what stories to tell to each. (Edit: Disclaimer: I was for a period of time part of an affiliate scheme for the product the linked site sells. The above link is not an affiliate link nor a product page. I was not paid to link to this information. The card/article credits "E.Rogers, Diffusion of Innovations" for the concept in case anyone would prefer the original source.) |
Beta Was this translation helpful? Give feedback.
-
There's a lot of useful discussion from the replies of the original posting, and that's great! Thanks for making the time. I brought up before, "promises" and "guarantees" are nice, and saying we promise that a keyword of feature will ALWAYS be stable seems like a good idea, except we give ourselves a get out clause with "deprecation", which is a little handwavey. I'm not saying that's a problem, just stating what I see. If we really want to or have to break something we promised would remain forever stable, suddenly our stability promises loose all meaning. Is a forever promise really feasable? What if we want to modify You could argue, we could create a new keyword, What's an alternative solution? Why? People are making "bets" on using JSON Schema and how long what they are doing can remain useable in production. We could make it shorter... 3 years. Maybe 5 years would be TOO long, allowing people to think "eh, I'll have gone by then." We don't want that. At that point, you could almost say, why not tick/tock a release every 1.5 years where one is "new stable" and the other is "experimental"? Well, that wouldn't be ideal either, given we want users to be able to use the latest and greatest keywords as soon as we make them available. (We acknowledged the lag between "hey, this is done" and it being in a published spec, is just too long.) Where does this leave us? Wait, doesn't this sound more related to the SDLC as opposed to making an immediate release without defining everything up front? Huge thanks to @mwadams for helping me think through and explore this and being a sounding board. Neither I nor @mwadams is advocating for any specific direction here, and I'm mearly presenting what I see, and presenting some thoughts and scenarios. |
Beta Was this translation helpful? Give feedback.
-
I have added my keyword assessments to the spreadsheet as a second sheet (use the tabs at the bottom of the screen to switch). Non-keyword features will be a separate sheet that I hope to have done sometime next week. Or at least start putting parts of it up. I will try to reply to all of the other threads where needed by Monday. |
Beta Was this translation helpful? Give feedback.
-
Part of the proposal here is to release a spec without making decisions about the lifecycle of the spec. There are many details that we can defer, but there are several things that we need to at least tentatively define in order to put out anything. How the spec will be published? Will the release live forever (like current drafts), or will it be replaced or can it changed at some point? What does it mean for users and implementers when the spec changes or is replaced? I suggest we continue work on defining a process, but keep it as minimal as possible for now. It would be just enough that users and implementers would know what they're getting into when they choose to use/implement this interim spec. |
Beta Was this translation helpful? Give feedback.
-
Can we be more explicit about what kind of feedback we expect this interim spec to provide about our process? There are a few aspects of this that don't make sense to me. First, if we put off deciding on any process decisions, we aren't giving people an opportunity to provide feedback because we haven't given them anything to provide feedback on. Second, process is orthogonal to the specification. Certain process decisions can limit what we can do with the spec, but the spec doesn't tell you anything explicitly about the process used to develop and release that spec. So, I'm not sure what producing a spec is going to tell people about our process that allows them to provide feedback. Third, for the most part, people don't care about how we develop and release the spec. How many JavaScript programmers know or care about TC-39? Probably not many. All users want/need to know is, "how will I be effected when the spec changes?". Anything else only effects those of us working on the spec. We should do what we think will work best for us, not what others think will work for us. I'm sure this is all mostly strawman argument based on unclear understanding of what is meant by "process" and "SDLC" in this proposal, so feel free to not directly address any parts that don't make sense as long as we can answer the initial question. What kind of feedback do we expect to get from an interim spec out our process? |
Beta Was this translation helpful? Give feedback.
-
I'm in agreement with @gregsdennis's posting on json-schema-org/json-schema-spec#1368 (comment)
I'll continue to push the charter work forward. I feel like there's a middle ground or at least a least problematic and most agreeable in relation to the next release. It seems like we all want a release "soon", but also want or need a longer process to make promises. What I'm proposing is slightly and subtily differnet to what we have seen so far. I propose the following:
This would give us:
Based on the discussion I've seen, I think these are all the things we all want without huge compromise. I know different people at different points have proposed parts of this previously. I'm not claiming 100% originality here. But I think this mix of things gives us the most things we all want, and allows us to move forward. |
Beta Was this translation helpful? Give feedback.
-
DECISION: We likely won't be releasing an "interim" spec. Discussions elsewhere and the decisions from them point us toward just progressing on the next version.
In leaving IETF and their publication processes, we find ourselves needing to define our own. Along with this is a concern from the community regarding the stability of the specification.
Stability
On the surface, users wanting "stability" means that they really just want a spec that's not marked as a "draft" so that they can be confident referencing it from their own specifications and other work. The "draft" label is really just part of the IETF process that indicates a specification is still undergoing development, so that will definitely be going.
However, we (the JSON Schema core team) recognize that stability goes much deeper than a mere label on the specification document. So, what does it mean for the specification to be "stable?"
JSON Schema at its various versions is already used in production systems globally. The problem for those who maintain those systems is that one version may contain features that are incompatible with other versions, either through deprecation or updated processing rules. Migrating schemas to newer versions comes with different sets of challenges depending on the current and target versions. As such it's difficult to know what needs to be updated during such migrations, and often users simply opt to leave things as they are rather than risk breaking something that's already working. The migration challenge usually presents itself when the tooling they're using falls out of maintenance or drops support for the JSON Schema version they're using, and they're forced to update. Recently, the alterschema tool has been created to aid with this migration, but the necessity of such a tool is merely an indicator of a larger problem: JSON Schema contains instabilities.
Besides any publication process changes, the looming problem of this instability needs to be addressed.
Options
So far, two primary proposals have been put forward:
Most feedback regarding these proposals has been generally positive, but what has been lacking is a path forward. If these proposals shed light on some end state, how do we get there?
The Path Forward
Before we can know that, we need to know where we stand currently. If we were to break down the specification into a list of features, what can we declare as stable? Do we even agree what the features are?
I've started a Google spreadsheet to identify and categorize features defined by the Core and Validation specifications as they currently stand in the
main
branch of the spec repo (which is considereddraft-next
). This sheet is available for anyone to view, but editing will be restricted to the core team.I would also like to propose the idea of publishing a stable-ish interim spec which moves us closer to our goals of full stability guarantees. This will show the community that this project is still active and that we're beginning to address their concerns about stability. To achieve this, we will need:
Completing these two tasks should get us to a point where we can put out something that pushes us toward our goals, communicates that we're still active, and invites feedback from the community.
Edit - Survey results
Thanks to the core team for adding their stability opinions to my spreadsheet (and for patience while I've been on leave). Here are some results:
Considered stable by everyone
Also,
pattern
was flagged by @ether as "semi-stable" as support of ECMA-style regex varies across languages, but otherwise it's regarded as stable.The rest of the keywords have various objections to "stable" status from several members. Some of these are in the vein of "it hasn't been around long enough in its current state" (i.e. it's recently added or changed), while others are more practical concerns. I encourage everyone to read through everyone else's notes to get an understanding of where we're all coming from.
There are also a couple viewpoints that everything is stable by virtue of there being published documents that define them. I think this highlights the need for us to further nail down exactly what we mean when we talk about "stability." I tend to think of a feature as stable if it isn't expected to change functionally from one version of the document to the next. I feel that calling something defined in an immutable document is stable is something of a tautology. Sure, that document (e.g. the 2020-12 publication) is isn't going to change, so what it defines isn't going to change, but I don't think that's what we're talking about. We're looking at changes in how individual features are expressed over multiple publications.
Beta Was this translation helpful? Give feedback.
All reactions