From 66817d320e0b4977d912d6076b0a02b6d1ba8f61 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Fri, 2 Oct 2026 16:18:45 +0100 Subject: [PATCH] =?UTF-8?q?feat(deed):=20(maturity=20=E2=80=A6)=20repo-dee?= =?UTF-8?q?d=20vocabulary?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Owner decision 2026-10-02: maturity is a clause of its own rather than a :maturity field on the status clause. Declares the clause (:level from the closed set experimental|alpha|beta|production|lts, optional :since), adds a valid fixture, and records the ruling on the maturity row of state-v1-decision. The rest of that decision stays open. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01AJZGNqQsEHjjhzfcNm4pt3 --- .../deed/mappings/state-v1-decision.adoc | 5 ++ .../fixtures/valid/maturity-clause_chora.deed | 11 ++++ 1-formats/deed/vocabulary/maturity.adoc | 66 +++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 1-formats/deed/tools/fixtures/valid/maturity-clause_chora.deed create mode 100644 1-formats/deed/vocabulary/maturity.adoc diff --git a/1-formats/deed/mappings/state-v1-decision.adoc b/1-formats/deed/mappings/state-v1-decision.adoc index abd5be74a..9ea15f5de 100644 --- a/1-formats/deed/mappings/state-v1-decision.adoc +++ b/1-formats/deed/mappings/state-v1-decision.adoc @@ -64,6 +64,11 @@ re-appearing. `(status … :maturity production)` — symbol, closed set as the comment taxon says. This is the single v1-vocabulary extension this family asks for, deliberately minimal and ruled-on-visible. + **Ruled 2026-10-02 (owner):** not the status field. Maturity is a clause + of its own, `(maturity :level … :since …)`, declared in + link:../vocabulary/maturity.adoc[vocabulary/maturity.adoc]. Option B's + translation therefore writes maturity there. Only this row is ruled; the + choice between A, B and C stays open. == 4. What is executable NOW without a ruling diff --git a/1-formats/deed/tools/fixtures/valid/maturity-clause_chora.deed b/1-formats/deed/tools/fixtures/valid/maturity-clause_chora.deed new file mode 100644 index 000000000..28b135c13 --- /dev/null +++ b/1-formats/deed/tools/fixtures/valid/maturity-clause_chora.deed @@ -0,0 +1,11 @@ +;; SPDX-License-Identifier: CC-BY-SA-4.0 +; Exercises every term of the (maturity ...) vocabulary: +; 1-formats/deed/vocabulary/maturity.adoc +(repo-deed + :schema-version "1.0.0" + :canonical-name "maturity-clause" + (status + :phase incubating) + (maturity + :level experimental + :since "2026-10-02")) diff --git a/1-formats/deed/vocabulary/maturity.adoc b/1-formats/deed/vocabulary/maturity.adoc new file mode 100644 index 000000000..e419ddd18 --- /dev/null +++ b/1-formats/deed/vocabulary/maturity.adoc @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// SPDX-FileCopyrightText: 2026 Jonathan D.A. Jewell += `(maturity …)` — repo-deed vocabulary for maturity +:toc: + +Status:: vocabulary, v1 (2026-10-02). Grammar unchanged: this is a `clause` +under the normative link:../spec/abnf/deed.abnf[deed.abnf] v1.0.0. +Ruling:: owner decision 2026-10-02: maturity is a clause of its own, not a +`:maturity` field on the `status` clause. This settles the `maturity` row of +link:../mappings/state-v1-decision.adoc[state-v1-decision] §3; the rest of +that decision is still open. +Fixture:: link:../tools/fixtures/valid/maturity-clause_chora.deed[maturity-clause_chora.deed]. + +As with link:updates.adoc[`(updates …)`], no production `estate_chora.deed` +exists yet, so this page is the declaration. The terms below move into that +file's `(vocabulary …)` clause verbatim when it lands. + +== Why a clause of its own + +Phase and maturity answer different questions. Phase (the `status` clause's +`:phase`) says where a repo is in its lifecycle: incubating, active, +archived. Maturity says how far a consumer can rely on what it ships. A repo +can be active and experimental, or archived and production. Keeping them in +separate clauses means neither is read as a qualifier of the other. + +== Where it appears + +Only in a `repo-deed` (`_chora.deed`), at most once, as a direct child +of the form. **No clause means the maturity is unstated**, not +`experimental`: a reader must not invent a default. + +== Terms + +[cols="2,3,2,5",options="header"] +|=== +| Term | Value | Required | Meaning + +| `:level` | SYMBOL, one of `experimental` `alpha` `beta` `production` `lts` | yes | How far a consumer can rely on the repo's output. The set is the one the v1 `[position] maturity` comment already named. +| `:since` | STRING, `YYYY-MM-DD` | no | The date the repo reached this level. +|=== + +`experimental`:: Shape and behaviour may change without notice. Do not +depend on it. +`alpha`:: Usable for trials. Breaking changes are expected. +`beta`:: Feature-complete for its stated scope. Breaking changes are +announced. +`production`:: Relied on by consumers. Breaking changes follow the repo's +versioning policy. +`lts`:: Production, with a stated support window. + +== Reader obligations + +* An unknown field inside `(maturity …)` is an error. +* A `:level` outside the closed set is an error, never mapped to a nearby + value. +* A string `:level` (`"beta"`) is an error: the value is a symbol. +* A deed with two `(maturity …)` clauses is an error. + +== Example + +[source,lisp] +---- +(maturity + :level experimental + :since "2026-10-02") +----