|
| 1 | +# JSON Schema Specification Development Process |
| 2 | +This document formally defines the process used to evolve the JSON Schema |
| 3 | +specification as of the first stable release in 2023. It applies to the core |
| 4 | +specification and the specifications for any dialects and vocabularies |
| 5 | +maintained by the JSON Schema Org. It does not necessarily apply to everything |
| 6 | +the JSON Schema Org maintains. For example, media type registration follows the |
| 7 | +IETF process. Certain components used within JSON Schema, such as Relative JSON |
| 8 | +Pointer, may also follow a separate process. |
| 9 | + |
| 10 | +## Canonical URLs |
| 11 | +There MUST be a stable canonical URL for referencing any specification that |
| 12 | +follows this process. If the spec is made available from any other URLs, they |
| 13 | +SHOULD redirect to the canonical URL. If the canonical URL is changed in the |
| 14 | +future, all previous canonical URLs MUST remain accessible as redirects to the |
| 15 | +current URL. |
| 16 | + |
| 17 | +## Mutable Spec |
| 18 | +There is only one version of the specification and it can be updated at any time |
| 19 | +as long as those changes don't violate the compatibility rules identified by the |
| 20 | +stability model. Bug fixes, clarifications, and other non-functional spec |
| 21 | +updates can be merged at any time even for stable features. A change-log blog |
| 22 | +post SHOULD be prepared quarterly to give visibility to any changes that were |
| 23 | +merged in the last quarter. |
| 24 | + |
| 25 | +## The Stability Model |
| 26 | +Every feature in the spec has a release status. It's either evolving, stable, or |
| 27 | +deprecated. Flags are used to show the status a feature is in. If a feature |
| 28 | +doesn't have a flag, it's considered stable. If it has a year flag (such as |
| 29 | +`2024`) that's the year the feature reached stability. The other flags indicate |
| 30 | +a feature that is not yet stable or is deprecated. |
| 31 | + |
| 32 | +### Champions |
| 33 | +Any feature that is evolving SHOULD have a champion. The champion is responsible |
| 34 | +for shepherding the feature through the process to into stable status. The |
| 35 | +champion doesn't need to do all the work, they're just responsible for making |
| 36 | +sure the work gets done. The champion role MAY be shared by more than one |
| 37 | +person. An evolving feature without a champion SHOULD be removed from the spec. |
| 38 | + |
| 39 | +### Proposals |
| 40 | +New features start out as proposals. Proposals are informal GitHub Issues or |
| 41 | +Discussions and can be submitted by anyone. |
| 42 | + |
| 43 | +All proposals MUST be backward compatible with the current stable specification. |
| 44 | +Features that could be problematic for forward compatibility are highly |
| 45 | +discouraged, but may be considered if the feature is optional and disabled by |
| 46 | +default. |
| 47 | + |
| 48 | +**Promotion Checklist:** |
| 49 | +[] Consensus among JSON Schema Org core contributors that the proposal is worth |
| 50 | + pursuing |
| 51 | +[] The proposal has a champion |
| 52 | +[] A PR for an entry for in the `STAGE-0` registry has been approved |
| 53 | + |
| 54 | +### STAGE-0 |
| 55 | +`STAGE-0` features are tracked in the `STAGE-0` Registry on the website. This |
| 56 | +registry lists all `STAGE-0` features. Each entry SHOULD include the following |
| 57 | +checklist as well as an informal description with at least one example and any |
| 58 | +relevant links. |
| 59 | + |
| 60 | +This stage requires at least two implementations to implement the feature. The |
| 61 | +purpose of these implementations is to identify any potential implementation |
| 62 | +issues that might lead to low adoption such as difficulty of implementation or |
| 63 | +performance implications. Therefore, these implementations don't need to be |
| 64 | +publicly available or have real world use at this point. |
| 65 | + |
| 66 | +**Promotion Checklist:** |
| 67 | +[] There is general consensus among the core contributors for adding the feature |
| 68 | + to the spec |
| 69 | +[] Tests are available in the test suite |
| 70 | +[] Two implementations have implemented the feature and pass the tests suite |
| 71 | +[] A blog post has been published introducing the feature |
| 72 | +[] A PR for the spec has been approved that completely specifies the feature and |
| 73 | + removes the feature from the `STAGE-0` registry. |
| 74 | + |
| 75 | +### STAGE-1 |
| 76 | +`STAGE-1` features are included to the specification, but flagged as `STAGE-1` |
| 77 | +and are not subject to the compatibility requirements of "stable" features. They |
| 78 | +can be added at any time as long as it meets all criteria for `STAGE-1` status. |
| 79 | + |
| 80 | +At this stage, the feature should be seeing real world use. These features MAY |
| 81 | +change or be removed all together based on what we learn from real world usage, |
| 82 | +but anything more than small changes should be extremely rare. Any necessary |
| 83 | +feature experimentation and evolution should have be done in `STAGE-0`. |
| 84 | + |
| 85 | +Implementers are encouraged to implement `STAGE-1` features, but are not |
| 86 | +expected to maintain support for previous versions if they change. Users who |
| 87 | +choose to use these features should be prepared for the possibility of changes |
| 88 | +and be willing to update their schemas if a change does occur. |
| 89 | + |
| 90 | +A `STAGE-1` feature can be promoted to `STAGE-2` at any time. Ideally a |
| 91 | +feature should stay in `STAGE-1` for about one year, but may stay longer if we |
| 92 | +don't see it used enough in the wild. |
| 93 | + |
| 94 | +**Promotion Checklist:** |
| 95 | +[] There is general consensus that the feature has been proven to be a good |
| 96 | + addition to JSON Schema and is unlikely to change. |
| 97 | +[] We see the feature being used successfully in the wild and not generating a |
| 98 | + lot of community support issues that could indicate a problem. |
| 99 | + |
| 100 | +### STAGE-2 |
| 101 | +`STAGE-2` features are in the last stages of becoming stable. Changes are |
| 102 | +unlikely, but backward incompatible changes are still allowed in extreme cases. |
| 103 | +Users can be reasonably sure that the feature won't change, but can't expect all |
| 104 | +implementations to support the feature yet. |
| 105 | + |
| 106 | +`STAGE-2` is a staging area for features that are ready to be declared stable, |
| 107 | +but are waiting for the next release or don't yet have enough implementations. |
| 108 | +When we see the vast majority of actively maintained implementations support |
| 109 | +this feature, it will be promoted to stable in the next release. Implementers |
| 110 | +SHOULD support `STAGE-2` features so they aren't out-of-date when the next |
| 111 | +release happens. |
| 112 | + |
| 113 | +Being in `STAGE-2` isn't a guarantee that a feature will be declared stable in |
| 114 | +the next release. If we don't see that the vast majority of actively maintained |
| 115 | +implementation have implemented the feature, it may stay in `STAGE-2` another |
| 116 | +year to allow implementations to catch up. |
| 117 | + |
| 118 | +`STAGE-2` features can only be promoted to stable as part of a release. |
| 119 | + |
| 120 | +**Promotion Checklist:** |
| 121 | +[] The vast majority of actively maintained implementations support the feature |
| 122 | + |
| 123 | +### Stable |
| 124 | +Any part of the specification that doesn't have stability flag or has a year |
| 125 | +stability flag such as `2024` is considered stable. This flag indicates the year |
| 126 | +a feature was declared stable. Any changes to stable features MUST be backward |
| 127 | +compatible and not introduce problems for forward compatibility. Stable features |
| 128 | +are never removed, but may be deprecated. |
| 129 | + |
| 130 | +### Deprecated |
| 131 | +Any feature in the specification that is flagged in the form `DEPRECATED-{YEAR}` |
| 132 | +is considered deprecated as of the year specified. Implementations SHOULD still |
| 133 | +support these features to maintain backward compatibility. Deprecated features |
| 134 | +will never be removed from the spec, but schema authors SHOULD migrate away from |
| 135 | +using them as implementations may begin dropping support for these features at |
| 136 | +some point. |
| 137 | + |
| 138 | +A feature can only be deprecated as part of a release. |
| 139 | + |
| 140 | +## Release Process |
| 141 | +Releases occur on Jan 1 every year. Each release is identified with the |
| 142 | +four-digit year of when the release occurred. Releases never introduce anything |
| 143 | +new. The only change should be updating `STAGE-2` flags to `{YEAR}` flags for |
| 144 | +the features that are promoted to stable that year, or adding adding deprecation |
| 145 | +flags for any features that are deprecated that year. |
| 146 | + |
| 147 | +Implementations that express support for a particular release MUST support all |
| 148 | +features that are stable as of that release. |
| 149 | + |
| 150 | +A snapshot of the spec will be taken of the stable parts of the spec and made |
| 151 | +available as a PDF on the website at. |
| 152 | + |
| 153 | +## Meta-Schemas |
| 154 | +Meta-schemas associated with the specification(s) maintained under this process |
| 155 | +are subject to the same compatibility rules as the specification. They can be |
| 156 | +updated at any time, but changes MUST be backward compatible and allow for |
| 157 | +forward compatibility with future schemas. |
| 158 | + |
| 159 | +Meta-schema URIs SHOULD not change once published, but if they do, the old URI |
| 160 | +MUST remain available and redirect to the new URI. |
| 161 | + |
| 162 | +Meta-schemas are considered non-normative. It's sometimes not possible or not |
| 163 | +practical for the meta-schema to describe every constraint in the specification. |
0 commit comments