diff --git a/envelope/COMPAGNON.fr.md b/envelope/COMPAGNON.fr.md index f78b6fc..96555fa 100644 --- a/envelope/COMPAGNON.fr.md +++ b/envelope/COMPAGNON.fr.md @@ -1,4 +1,4 @@ -# Enveloppe d'assertion v0.1 — compagnon français +# Enveloppe d'assertion v1.0 — compagnon français > **Non normatif.** Seul [`SPEC.md`](SPEC.md) fait foi. En cas d'écart entre ce > compagnon et la spécification, la spécification l'emporte — c'est le motif diff --git a/envelope/SPEC.md b/envelope/SPEC.md index 00ae6ab..725c7a2 100644 --- a/envelope/SPEC.md +++ b/envelope/SPEC.md @@ -1,9 +1,10 @@ -# Assertion Envelope — Specification v0.1 +# Assertion Envelope — Specification v1.0 -**Status**: draft until the pull request introducing it is approved; versioned -thereafter under the compatibility policy below, never by ADR status -(ADR-061 §3.3 as amended by A1: the contract is published, versioned and -deprecated — it is not proposed or endorsed). +**Status**: stable. Declared v1.0 upon the first real federated exchange +between two distinct jurisdictions — openathle → Prismagram, endorsed +2026-09-08 — the trigger `OPENING.md` names. Versioned under the compatibility +policy below, never by ADR status (ADR-061 §3.3 as amended by A1: the contract +is published, versioned and deprecated — it is not proposed or endorsed). **Mandated by**: ADR-061 §10.2. The ten-field sketch of ADR-061 §3.3 is the documented origin of this text and is not normative. Where they differ, this specification prevails. @@ -47,7 +48,7 @@ An envelope message is a single assertion, encoded as a JSON object or an equivalent YAML mapping, validating against `schema/assertion.schema.json`. ```yaml -envelope: "0.1" +envelope: "1.0" id: openathle/PU-001 class: traversal subject: "Renouvellement de licence athlète, saison N+1" @@ -76,7 +77,7 @@ fields (§7). | # | Field | Type | Constraint | |---|---|---|---| -| 1 | `envelope` | string | REQUIRED. The version of this contract, e.g. `"0.1"`. A message that does not declare its version is not versioned — it is only dated by its documents (A1 §3). SHOULD be the first key | +| 1 | `envelope` | string | REQUIRED. The version of this contract, e.g. `"1.0"`. A message that does not declare its version is not versioned — it is only dated by its documents (A1 §3). SHOULD be the first key | | 2 | `id` | string | REQUIRED. `/`. The prefix names the asserting authority. Never rewritten in transit (§2.1) | | 3 | `class` | string | REQUIRED. One of §5 | | 4 | `subject` | string | REQUIRED. What the assertion is about | @@ -126,6 +127,11 @@ a standard field is a contract change under §8. - Versioning is `MAJOR.MINOR`. MINOR: additions (fields, classes, relation kinds, rites) that consumers can ignore or treat as opaque. MAJOR: removal, renaming, or semantic change of anything existing. +- **v1.0 is substantively identical to v0.1**: no field, class, provenance, + rite or rule changed — the draft survived its first real exchange and is + declared stable, nothing more. Consumers MUST treat `envelope: "0.1"` + messages as v1.0 messages; the schema accepts both values. This equivalence + is specific to this pair and will not be repeated across future MAJORs. - At most **two published versions per year**. Deprecation is announced in this file at least one version before removal. - Consumers MUST accept any message whose `envelope` shares their MAJOR and diff --git a/envelope/conformance/producer/valid/real-traversal-openathle-as-v1.json b/envelope/conformance/producer/valid/real-traversal-openathle-as-v1.json new file mode 100644 index 0000000..e267147 --- /dev/null +++ b/envelope/conformance/producer/valid/real-traversal-openathle-as-v1.json @@ -0,0 +1,38 @@ +{ + "envelope": "1.0", + "id": "openathle/PU-001", + "class": "traversal", + "subject": "Renouvellement de licence athlète, saison N+1", + "statement": "Permettre à un athlète — ou à son tuteur — de reconduire sa licence pour la saison à venir sans ressaisir son dossier.", + "evidence": [ + { + "kind": "source", + "ref": "docs/parcours/PU-001-renouvellement-licence.md" + }, + { + "kind": "role_primaire", + "ref": "ATHLETE" + }, + { + "kind": "role_primaire", + "ref": "TUTEUR_LEGAL" + } + ], + "provenance": "imported", + "confidence": 0.4, + "endorsement": null, + "jurisdiction": "openathle", + "at": "2026-09-04T00:00:00Z", + "lifecycle": "proposed", + "relations": { + "depends_on": [ + "openathle/ADR-025", + "openathle/ADR-014", + "openathle/ADR-016", + "openathle/ADR-020" + ] + }, + "deadline": null, + "falsification": null, + "x_temoin_source_sha256": "03ab516254" +} diff --git a/envelope/schema/assertion.schema.json b/envelope/schema/assertion.schema.json index d0eb692..a34d729 100644 --- a/envelope/schema/assertion.schema.json +++ b/envelope/schema/assertion.schema.json @@ -1,18 +1,33 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://prismagram.com/published-language/envelope/0.1/assertion.schema.json", + "$id": "https://prismagram.com/published-language/envelope/1.0/assertion.schema.json", "title": "Assertion Envelope v0.1", "description": "Producer contract for envelope v0.1 messages (SPEC.md §4). One cross-field rule cannot be expressed here and is enforced by the conformance runner: `jurisdiction` MUST equal the prefix of `id`.", "type": "object", "required": [ - "envelope", "id", "class", "subject", "statement", "evidence", - "provenance", "confidence", "endorsement", "jurisdiction", "at", - "lifecycle", "relations", "deadline", "falsification" + "envelope", + "id", + "class", + "subject", + "statement", + "evidence", + "provenance", + "confidence", + "endorsement", + "jurisdiction", + "at", + "lifecycle", + "relations", + "deadline", + "falsification" ], "properties": { "envelope": { - "const": "0.1", - "description": "Version of the contract. A message that does not declare its version is not versioned (A1 §3)." + "enum": [ + "0.1", + "1.0" + ], + "description": "Version of the contract. v1.0 is substantively identical to v0.1 (SPEC §8): both values validate. A message that does not declare its version is not versioned (A1 §3)." }, "id": { "type": "string", @@ -21,20 +36,42 @@ }, "class": { "enum": [ - "invariant", "step_realized", "transition", "traversal", "stressor", - "decision", "constraint", "measure", "conflict", "hypothesis" + "invariant", + "step_realized", + "transition", + "traversal", + "stressor", + "decision", + "constraint", + "measure", + "conflict", + "hypothesis" ] }, - "subject": { "type": "string", "minLength": 1 }, - "statement": { "type": "string" }, + "subject": { + "type": "string", + "minLength": 1 + }, + "statement": { + "type": "string" + }, "evidence": { "type": "array", "items": { "type": "object", - "required": ["kind", "ref"], + "required": [ + "kind", + "ref" + ], "properties": { - "kind": { "type": "string", "minLength": 1 }, - "ref": { "type": "string", "minLength": 1 } + "kind": { + "type": "string", + "minLength": 1 + }, + "ref": { + "type": "string", + "minLength": 1 + } }, "additionalProperties": false } @@ -52,14 +89,32 @@ }, "endorsement": { "oneOf": [ - { "type": "null" }, + { + "type": "null" + }, { "type": "object", - "required": ["by", "at", "rite"], + "required": [ + "by", + "at", + "rite" + ], "properties": { - "by": { "type": "string", "minLength": 1 }, - "at": { "type": "string", "format": "date-time" }, - "rite": { "enum": ["pr_approval", "ui", "batch"] } + "by": { + "type": "string", + "minLength": 1 + }, + "at": { + "type": "string", + "format": "date-time" + }, + "rite": { + "enum": [ + "pr_approval", + "ui", + "batch" + ] + } }, "additionalProperties": false } @@ -70,26 +125,59 @@ "type": "string", "pattern": "^[a-z][a-z0-9]{2,31}$" }, - "at": { "type": "string", "format": "date-time" }, + "at": { + "type": "string", + "format": "date-time" + }, "lifecycle": { - "enum": ["proposed", "endorsed", "superseded", "rejected", "under_revision"], + "enum": [ + "proposed", + "endorsed", + "superseded", + "rejected", + "under_revision" + ], "description": "What the origin declares about its own assertion. Not an approval: the proven event lives in `endorsement` (ADR-070 §3.2)." }, "relations": { "type": "object", "properties": { - "amends": { "$ref": "#/$defs/idList" }, - "supersedes": { "$ref": "#/$defs/idList" }, - "depends_on": { "$ref": "#/$defs/idList" }, - "satellite_of": { "$ref": "#/$defs/idList" } + "amends": { + "$ref": "#/$defs/idList" + }, + "supersedes": { + "$ref": "#/$defs/idList" + }, + "depends_on": { + "$ref": "#/$defs/idList" + }, + "satellite_of": { + "$ref": "#/$defs/idList" + } }, "additionalProperties": false }, "deadline": { - "oneOf": [{ "type": "null" }, { "type": "string", "format": "date-time" }] + "oneOf": [ + { + "type": "null" + }, + { + "type": "string", + "format": "date-time" + } + ] }, "falsification": { - "oneOf": [{ "type": "null" }, { "type": "string", "minLength": 1 }] + "oneOf": [ + { + "type": "null" + }, + { + "type": "string", + "minLength": 1 + } + ] } }, "patternProperties": {