From b6c7a985f9c6851acd0fe3918681e79ff308022d Mon Sep 17 00:00:00 2001 From: Greg Dennis Date: Tue, 2 Apr 2024 11:26:56 +1300 Subject: [PATCH 1/9] write up initial spec development/publication process --- PROCESS.md | 169 +++++++++++++++++++++++++++++++++++++++++ feature-life-cycle.png | Bin 0 -> 29333 bytes 2 files changed, 169 insertions(+) create mode 100644 PROCESS.md create mode 100644 feature-life-cycle.png diff --git a/PROCESS.md b/PROCESS.md new file mode 100644 index 00000000..9354da64 --- /dev/null +++ b/PROCESS.md @@ -0,0 +1,169 @@ +# JSON Schema Specification Development and Publication Process + +## Purpose + +This document describes the development and publication process for the JSON Schema specifications contained within this repository. + +- [JSON Schema Core](./jsonschema-core.md) +- [JSON Schema Validation](./jsonschema-validation.md) + +## Definitions + +### Defined Behavior + +Some behaviors within JSON Schema may be explicitly or implicitly undefined by the specifications for various reasons. How to handle these behaviors is generally left to implementations. + +A defined behavior is one that is fully defined by the specifications. + +### Stability and Breaking Changes + +Stability is defined using the level of compatibility between sequential releases. If all schemas which are written to one release produce the same defined behavior under the following release, then those releases are compatible, and the specification is said to be stable between them. + +If an existing schema under the new release exhibits defined behavior that is contrary to defined behavior under the previous release, the new release is said to contain breaking changes and the specification is unstable between those releases. + +If a new release fully defines a previously undefined (or under-defined) behavior, the new release is still considered compatible, even if it contradicts the decision of any particular implementation. + +### Release + +A release is any single publication of the JSON Schema specifications (as a group). + +### Version + +Consecutive releases which maintain compatibility with each other comprise a version. + +## Release and Version + +The JSON Schema specification will aim to publish annually on or about the first of January each year. Releases are identified by the year they are published. + +When a new release contains breaking changes, that release begins a new version of JSON Schema. + +The version will be identified as an integer, starting with `1` and incrementing as needed. + +Stability will be prioritized when making changes to the specification. Breaking changes are undesired and should be avoided when possible. + +## Publication + +### Specifications + +The specifications will be published on the JSON Schema website, https://json-schema.org/, using a path comprised of the version, year, and document name. For example, + +``` +https://json-schema.org/1/2025/core.html +https://json-schema.org/1/2025/validation.html +``` + +### Meta-schemas + +A release meta-schema will be published under the same path using `schema` as the file name. + +``` +https://json-schema.org/1/2025/schema +``` + +The meta-schema for the latest release in a version will also be published under the version path with `schema` as the file name. + +``` +https://json-schema.org/1/schema +``` + +The latest-release meta-schemas will be updated with proposals as indicated by the [Proposal section](#proposal) of this document. + +```diff +@@ These are merely publication URLs. The spec will define the `$id` values for the meta-schemas. @@ +``` + +## Feature Life Cycle + +New features will progress through a sequence of stages before being added to the specification, and existing stable features must be formally deprecated before being removed. The stages of the life cycle, in order, are: + +- Concept +- Proposal +- Experimentation +- Stable +- Deprecated +- Removed + +The flow through these stages is depicted below: + +![Feature Life Cycle Flow](./feature-life-cycle.png) + +### Concept + +The feature life cycle begins with an idea expressed in a GitHub issue in this repository. Initial discussion may occur in Slack or another space, but the life cycle does not formally begin until a GitHub issue is created. + +The discussion should cover how the feature could work, use cases, syntax, alternatives, whether it’s a breaking change, etc., with a goal of deciding rough requirements. + +During this stage, members of the Core Team will implement private prototypes of the ideas expressed in the issue to get a feel for how it integrates with the stable features. Questions to address may include: + +- Does the idea operate within the confines of existing JSON Schema evaluation processes, or does it define something new? +- Is the idea merely a shortcut for some existing functionality (syntactic sugar), or does it solve a previously unsolvable problem? +- What is the expected complexity for implementing the feature? + +### Proposal + +Once a rough consensus for the idea has been reached, a formal proposal will be written, separate from the specification, with the goal of precisely defining specification changes. + +The proposal will use the [Proposal Template]() and be stored in this repository's `proposals` folder. + +```diff +@@ TODO: Define Proposal Template and fill in the link. @@ +``` + +Proposed keywords will be added to the appropriate vocabulary meta-schemas in: + +- latest published release and +- the `main` branch of this repository. + +The subschema for the proposed keyword will contain only a `$comment` keyword indicating that the feature is experimental and containing a link to the proposal document. Aside from the `$comment` keyword, the subschema will be empty. + +_This is done so that a proposed keyword is allowed but not validated as its syntax may change during the proposal/experimentation process. It also permits different implementations to support different variations of each proposal separately throughout this process. It will be up to the implementation to validate these keywords in accordance with their support._ + +Tests for the proposal are added to the JSON Schema Test Suite. + +```diff +@@ TODO: Identify a location within the test suite for proposals. @@ +``` + +### Experimentation + +Once the initial proposal has been completed, implementations may begin to support the new feature. + +Feedback from implementers and users are result in refinements to the proposal, which will then be updated in the implementations. + +Breaking changes to a proposed feature MAY occur, but are highly discouraged. + +In order to proceed to the next stage ([Stable](#stable)): + +- at least five (5) implementations support the feature +- there is sufficient evidence of use +- no changes are requested for a period of six (6) weeks + +```diff +@@ TODO: Determine usage metrics. @@ +``` + +Experimental features are not considered to be interoperable across implementations. + +If a proposal cannot advance to the next stage, it may be removed. The proposal document is moved to an `archive` subfolder, the keyword is removed from the meta-schemas, and any tests are moved to an `archive` subfolder. The removal of a non-stable feature is not considered a breaking change. + +### Stable + +The proposal is incorporated into the specification in the `main` branch, and the feature will be required as of the next release. + +The appropriate vocabulary meta-schema in the `main` branch is updated to include a subschema that validates the feature's syntax requirements. This will be made available with the next release. + +The published meta-schema (for the current release) will have the keyword removed. + +The appropriate tests are incorporated into the main suite. + +### Deprecated + +If a feature is no longer useful, e.g. it has been replaced, it may be deprecated by indicating it as such in the specification. + +Implementations must support deprecated features. + +### Removed + +A feature must have been published as deprecated for at least one release before it can be considered for removal. + +Feature removal is considered a breaking change. diff --git a/feature-life-cycle.png b/feature-life-cycle.png new file mode 100644 index 0000000000000000000000000000000000000000..38a1eb18a18c0915cff772634f7d70a93df41c90 GIT binary patch literal 29333 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 Date: Tue, 16 Apr 2024 10:55:15 +1200 Subject: [PATCH 2/9] tweaks to language; add a stability table --- PROCESS.md | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/PROCESS.md b/PROCESS.md index 9354da64..cccf5996 100644 --- a/PROCESS.md +++ b/PROCESS.md @@ -13,7 +13,7 @@ This document describes the development and publication process for the JSON Sch Some behaviors within JSON Schema may be explicitly or implicitly undefined by the specifications for various reasons. How to handle these behaviors is generally left to implementations. -A defined behavior is one that is fully defined by the specifications. +A defined behavior is one that is fully and unambiguously defined by the specifications. ### Stability and Breaking Changes @@ -23,6 +23,35 @@ If an existing schema under the new release exhibits defined behavior that is co If a new release fully defines a previously undefined (or under-defined) behavior, the new release is still considered compatible, even if it contradicts the decision of any particular implementation. +For reference, this table shows the validation results of a hypothetical schema and instance across two consecutive releases to illustrate the compatibility of those releases: + + + + + + + + + + + + + + + + + + + + + + + + + + +
            Next➡️
⬇️Current
truefalseindeterminant
true
false
indeterminant
+ ### Release A release is any single publication of the JSON Schema specifications (as a group). @@ -33,7 +62,7 @@ Consecutive releases which maintain compatibility with each other comprise a ver ## Release and Version -The JSON Schema specification will aim to publish annually on or about the first of January each year. Releases are identified by the year they are published. +The JSON Schema specification will aim to publish annually on or about the First of January each year. Releases are identified by the year they are published. When a new release contains breaking changes, that release begins a new version of JSON Schema. @@ -69,7 +98,7 @@ https://json-schema.org/1/schema The latest-release meta-schemas will be updated with proposals as indicated by the [Proposal section](#proposal) of this document. ```diff -@@ These are merely publication URLs. The spec will define the `$id` values for the meta-schemas. @@ +@@ These are merely publication URLs. The specification will define the `$id` values for the meta-schemas. @@ ``` ## Feature Life Cycle @@ -128,7 +157,7 @@ Tests for the proposal are added to the JSON Schema Test Suite. Once the initial proposal has been completed, implementations may begin to support the new feature. -Feedback from implementers and users are result in refinements to the proposal, which will then be updated in the implementations. +Feedback from implementers and users are expected to result in refinements to the proposal, which will then be updated in the implementations. Breaking changes to a proposed feature MAY occur, but are highly discouraged. @@ -144,7 +173,7 @@ In order to proceed to the next stage ([Stable](#stable)): Experimental features are not considered to be interoperable across implementations. -If a proposal cannot advance to the next stage, it may be removed. The proposal document is moved to an `archive` subfolder, the keyword is removed from the meta-schemas, and any tests are moved to an `archive` subfolder. The removal of a non-stable feature is not considered a breaking change. +If a proposal cannot advance to the next stage, it may be removed. The proposal document is moved to an `archive` subfolder, the keyword is removed from the meta-schemas, and any tests are moved to an `archive` subfolder. The removal of a feature which has not reached the stable state is not considered a breaking change. ### Stable @@ -152,7 +181,7 @@ The proposal is incorporated into the specification in the `main` branch, and th The appropriate vocabulary meta-schema in the `main` branch is updated to include a subschema that validates the feature's syntax requirements. This will be made available with the next release. -The published meta-schema (for the current release) will have the keyword removed. +Upon publication of the new release, the meta-schema for the lapsed release will have the keyword removed. The appropriate tests are incorporated into the main suite. From 6390ba27212cc13da6783a2abcd34647704d89ec Mon Sep 17 00:00:00 2001 From: Greg Dennis Date: Tue, 16 Apr 2024 10:56:42 +1200 Subject: [PATCH 3/9] use pass/fail instead of true/false --- PROCESS.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PROCESS.md b/PROCESS.md index cccf5996..7e35b4f6 100644 --- a/PROCESS.md +++ b/PROCESS.md @@ -28,18 +28,18 @@ For reference, this table shows the validation results of a hypothetical schema - - + + - + - + From 9fec32d9a6ede1b50b2b16bb3b7920b0dac21687 Mon Sep 17 00:00:00 2001 From: Greg Dennis Date: Tue, 16 Apr 2024 11:13:53 +1200 Subject: [PATCH 4/9] update column widths --- PROCESS.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PROCESS.md b/PROCESS.md index 7e35b4f6..ce9581a5 100644 --- a/PROCESS.md +++ b/PROCESS.md @@ -25,12 +25,12 @@ If a new release fully defines a previously undefined (or under-defined) behavio For reference, this table shows the validation results of a hypothetical schema and instance across two consecutive releases to illustrate the compatibility of those releases: -
            Next➡️
⬇️Current
truefalsepassfail indeterminant
truepass
falsefail
+
- - - + + + From 554e694d84c7b023c7906f16cac99b76299c8345 Mon Sep 17 00:00:00 2001 From: Greg Dennis Date: Wed, 17 Apr 2024 09:53:44 +1200 Subject: [PATCH 5/9] add note about the permanance of specification URLs --- PROCESS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PROCESS.md b/PROCESS.md index ce9581a5..015b1aba 100644 --- a/PROCESS.md +++ b/PROCESS.md @@ -81,6 +81,8 @@ https://json-schema.org/1/2025/core.html https://json-schema.org/1/2025/validation.html ``` +Once a specification document has been published, neither the document (save for minor errata such as spelling mistakes) nor its publication URL may change. If the TSC elects to alter the above URL scheme, the new scheme only applies to future publications and are not retroactive. + ### Meta-schemas A release meta-schema will be published under the same path using `schema` as the file name. From c6424fe92a50818a945cdc5d72b6126eb6e44089 Mon Sep 17 00:00:00 2001 From: Greg Dennis Date: Wed, 17 Apr 2024 13:12:16 +1200 Subject: [PATCH 6/9] added notes based on PR feedback --- PROCESS.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/PROCESS.md b/PROCESS.md index 015b1aba..246609be 100644 --- a/PROCESS.md +++ b/PROCESS.md @@ -15,6 +15,8 @@ Some behaviors within JSON Schema may be explicitly or implicitly undefined by t A defined behavior is one that is fully and unambiguously defined by the specifications. +An undefined behavior is said to have an "indeterminate" validation result since implementations may resolve the behavior in different ways. + ### Stability and Breaking Changes Stability is defined using the level of compatibility between sequential releases. If all schemas which are written to one release produce the same defined behavior under the following release, then those releases are compatible, and the specification is said to be stable between them. @@ -30,7 +32,7 @@ For reference, this table shows the validation results of a hypothetical schema - + @@ -45,7 +47,7 @@ For reference, this table shows the validation results of a hypothetical schema - + @@ -130,6 +132,8 @@ During this stage, members of the Core Team will implement private prototypes of - Is the idea merely a shortcut for some existing functionality (syntactic sugar), or does it solve a previously unsolvable problem? - What is the expected complexity for implementing the feature? +At least two (2) Core Team members must have implemented prototypes before the concept can continue to the formal proposal process. + ### Proposal Once a rough consensus for the idea has been reached, a formal proposal will be written, separate from the specification, with the goal of precisely defining specification changes. @@ -155,9 +159,11 @@ Tests for the proposal are added to the JSON Schema Test Suite. @@ TODO: Identify a location within the test suite for proposals. @@ ``` +Once an initial draft of the proposal has been completed and published, the feature moves into Experimentation. + ### Experimentation -Once the initial proposal has been completed, implementations may begin to support the new feature. +Implementations may begin to support the new feature. Feedback from implementers and users are expected to result in refinements to the proposal, which will then be updated in the implementations. From 42185bd8a8b44942f0d9253e4a5f847415dd1daa Mon Sep 17 00:00:00 2001 From: Greg Dennis Date: Sat, 20 Apr 2024 11:52:20 +1200 Subject: [PATCH 7/9] update availability details for meta-schemas --- PROCESS.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/PROCESS.md b/PROCESS.md index 246609be..9d4b5161 100644 --- a/PROCESS.md +++ b/PROCESS.md @@ -87,22 +87,27 @@ Once a specification document has been published, neither the document (save for ### Meta-schemas -A release meta-schema will be published under the same path using `schema` as the file name. +A release meta-schema will be published under the same path using `schema.json` as the file name. ``` -https://json-schema.org/1/2025/schema +https://json-schema.org/1/2025/schema.json ``` -The meta-schema for the latest release in a version will also be published under the version path with `schema` as the file name. +The website will also be configured to: -``` -https://json-schema.org/1/schema -``` +- serve the meta-schema from its release folder + ``` + https://json-schema.org/1/2025/ + ``` +- serve the meta-schema for the latest release in a version from its version folder + ``` + https://json-schema.org/1/ + ``` The latest-release meta-schemas will be updated with proposals as indicated by the [Proposal section](#proposal) of this document. ```diff -@@ These are merely publication URLs. The specification will define the `$id` values for the meta-schemas. @@ +@@ These are only publication and availability URLs. The specification will define the `$id` values for the meta-schemas. @@ ``` ## Feature Life Cycle From f7a0219d59dd80851a31372b71813ff55dee09b4 Mon Sep 17 00:00:00 2001 From: Greg Dennis Date: Sat, 20 Apr 2024 11:54:37 +1200 Subject: [PATCH 8/9] italic corner square of table --- PROCESS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PROCESS.md b/PROCESS.md index 9d4b5161..867af58a 100644 --- a/PROCESS.md +++ b/PROCESS.md @@ -29,7 +29,7 @@ For reference, this table shows the validation results of a hypothetical schema
            Next➡️
⬇️Current
passfailindeterminantpassfailindeterminant
pass            Next➡️
⬇️Current
pass failindeterminantindeterminate
pass
indeterminantindeterminate
- + From 44983c3d03bc255d2493b4b5c57732c40c45619e Mon Sep 17 00:00:00 2001 From: Greg Dennis Date: Tue, 23 Apr 2024 10:18:35 +1200 Subject: [PATCH 9/9] use markdown table --- PROCESS.md | 31 +++++-------------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/PROCESS.md b/PROCESS.md index 867af58a..d9b93adb 100644 --- a/PROCESS.md +++ b/PROCESS.md @@ -27,32 +27,11 @@ If a new release fully defines a previously undefined (or under-defined) behavio For reference, this table shows the validation results of a hypothetical schema and instance across two consecutive releases to illustrate the compatibility of those releases: -
            Next➡️
⬇️Current
            Next➡️
⬇️Current
pass fail indeterminate
- - - - - - - - - - - - - - - - - - - - - - - - -
            Next➡️
⬇️Current
passfailindeterminate
pass
fail
indeterminate
+| _Next_ ➡️
⬇️ _Current_ | pass | fail | indeterminate | +|:---:|:---:|:---:|:---:| +| **pass** | ✅ | ❌ | ❌ | +| **fail** | ❌ | ✅ | ❌ | +| **indeterminate** | ✅ | ✅ | ✅ | ### Release