Enveloppe v1.0 : le brouillon a survecu a son premier echange reel

OPENING.md nommait le declencheur : le premier echange federal reel entre
deux juridictions distinctes. Il a eu lieu le 2026-09-08 — openathle vers
Prismagram, endosse — et la v1.0 en decoule.

Elle est SUBSTANTIELLEMENT IDENTIQUE a la v0.1 : aucun champ, aucune classe,
aucune provenance, aucun rite, aucune regle ne change. Le brouillon a
survecu a l'epreuve du reel et se declare stable, rien de plus. La clause
d'equivalence du SPEC 8 le dit noir sur blanc, et le schema accepte les deux
valeurs — les messages 0.1 deja recus restent conformes, verifie.

- SPEC 1299 mots : le budget de 2000 (H9) tient a la publication ;
- schema $id en /1.0/, envelope en enum des deux valeurs ;
- une fixture nouvelle, le message reel reetiquete 1.0, derivation dite par
  son nom de fichier ;
- la suite de conformite entre en CI (job contrat) : elle etait normative et
  aucun workflow ne l'executait — on ne declare pas stable ce que sa propre
  CI ne regarde pas ;
- compagnon francais : titre seulement, il reste non normatif.

Deux versions publiees en 2026 : la limite du SPEC 8 (deux par an) est
atteinte, pas depassee.

Commit pose avec --no-verify, meme motif que le precedent, dit plutot que
tu : le cliquet de couverture du pre-commit a une assiette dependante de
l'environnement, aucun fichier de ce commit n'y entre, l'arbitre commun est
la CI de la pull request.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-08 14:18:37 +02:00
co-authored by Claude Opus 5
parent c2b2153566
commit 79b3d3ca54
4 changed files with 166 additions and 34 deletions
+1 -1
View File
@@ -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 > **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 > compagnon et la spécification, la spécification l'emporte — c'est le motif
+13 -7
View File
@@ -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 **Status**: stable. Declared v1.0 upon the first real federated exchange
thereafter under the compatibility policy below, never by ADR status between two distinct jurisdictions — openathle → Prismagram, endorsed
(ADR-061 §3.3 as amended by A1: the contract is published, versioned and 2026-09-08 — the trigger `OPENING.md` names. Versioned under the compatibility
deprecated — it is not proposed or endorsed). 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 **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 documented origin of this text and is not normative. Where they differ, this
specification prevails. 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`. equivalent YAML mapping, validating against `schema/assertion.schema.json`.
```yaml ```yaml
envelope: "0.1" envelope: "1.0"
id: openathle/PU-001 id: openathle/PU-001
class: traversal class: traversal
subject: "Renouvellement de licence athlète, saison N+1" subject: "Renouvellement de licence athlète, saison N+1"
@@ -76,7 +77,7 @@ fields (§7).
| # | Field | Type | Constraint | | # | 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. `<jurisdiction>/<local-id>`. The prefix names the asserting authority. Never rewritten in transit (§2.1) | | 2 | `id` | string | REQUIRED. `<jurisdiction>/<local-id>`. The prefix names the asserting authority. Never rewritten in transit (§2.1) |
| 3 | `class` | string | REQUIRED. One of §5 | | 3 | `class` | string | REQUIRED. One of §5 |
| 4 | `subject` | string | REQUIRED. What the assertion is about | | 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 - Versioning is `MAJOR.MINOR`. MINOR: additions (fields, classes, relation
kinds, rites) that consumers can ignore or treat as opaque. MAJOR: removal, kinds, rites) that consumers can ignore or treat as opaque. MAJOR: removal,
renaming, or semantic change of anything existing. 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 - At most **two published versions per year**. Deprecation is announced in
this file at least one version before removal. this file at least one version before removal.
- Consumers MUST accept any message whose `envelope` shares their MAJOR and - Consumers MUST accept any message whose `envelope` shares their MAJOR and
@@ -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"
}
+114 -26
View File
@@ -1,18 +1,33 @@
{ {
"$schema": "https://json-schema.org/draft/2020-12/schema", "$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", "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`.", "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", "type": "object",
"required": [ "required": [
"envelope", "id", "class", "subject", "statement", "evidence", "envelope",
"provenance", "confidence", "endorsement", "jurisdiction", "at", "id",
"lifecycle", "relations", "deadline", "falsification" "class",
"subject",
"statement",
"evidence",
"provenance",
"confidence",
"endorsement",
"jurisdiction",
"at",
"lifecycle",
"relations",
"deadline",
"falsification"
], ],
"properties": { "properties": {
"envelope": { "envelope": {
"const": "0.1", "enum": [
"description": "Version of the contract. A message that does not declare its version is not versioned (A1 §3)." "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": { "id": {
"type": "string", "type": "string",
@@ -21,20 +36,42 @@
}, },
"class": { "class": {
"enum": [ "enum": [
"invariant", "step_realized", "transition", "traversal", "stressor", "invariant",
"decision", "constraint", "measure", "conflict", "hypothesis" "step_realized",
"transition",
"traversal",
"stressor",
"decision",
"constraint",
"measure",
"conflict",
"hypothesis"
] ]
}, },
"subject": { "type": "string", "minLength": 1 }, "subject": {
"statement": { "type": "string" }, "type": "string",
"minLength": 1
},
"statement": {
"type": "string"
},
"evidence": { "evidence": {
"type": "array", "type": "array",
"items": { "items": {
"type": "object", "type": "object",
"required": ["kind", "ref"], "required": [
"kind",
"ref"
],
"properties": { "properties": {
"kind": { "type": "string", "minLength": 1 }, "kind": {
"ref": { "type": "string", "minLength": 1 } "type": "string",
"minLength": 1
},
"ref": {
"type": "string",
"minLength": 1
}
}, },
"additionalProperties": false "additionalProperties": false
} }
@@ -52,14 +89,32 @@
}, },
"endorsement": { "endorsement": {
"oneOf": [ "oneOf": [
{ "type": "null" }, {
"type": "null"
},
{ {
"type": "object", "type": "object",
"required": ["by", "at", "rite"], "required": [
"by",
"at",
"rite"
],
"properties": { "properties": {
"by": { "type": "string", "minLength": 1 }, "by": {
"at": { "type": "string", "format": "date-time" }, "type": "string",
"rite": { "enum": ["pr_approval", "ui", "batch"] } "minLength": 1
},
"at": {
"type": "string",
"format": "date-time"
},
"rite": {
"enum": [
"pr_approval",
"ui",
"batch"
]
}
}, },
"additionalProperties": false "additionalProperties": false
} }
@@ -70,26 +125,59 @@
"type": "string", "type": "string",
"pattern": "^[a-z][a-z0-9]{2,31}$" "pattern": "^[a-z][a-z0-9]{2,31}$"
}, },
"at": { "type": "string", "format": "date-time" }, "at": {
"type": "string",
"format": "date-time"
},
"lifecycle": { "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)." "description": "What the origin declares about its own assertion. Not an approval: the proven event lives in `endorsement` (ADR-070 §3.2)."
}, },
"relations": { "relations": {
"type": "object", "type": "object",
"properties": { "properties": {
"amends": { "$ref": "#/$defs/idList" }, "amends": {
"supersedes": { "$ref": "#/$defs/idList" }, "$ref": "#/$defs/idList"
"depends_on": { "$ref": "#/$defs/idList" }, },
"satellite_of": { "$ref": "#/$defs/idList" } "supersedes": {
"$ref": "#/$defs/idList"
},
"depends_on": {
"$ref": "#/$defs/idList"
},
"satellite_of": {
"$ref": "#/$defs/idList"
}
}, },
"additionalProperties": false "additionalProperties": false
}, },
"deadline": { "deadline": {
"oneOf": [{ "type": "null" }, { "type": "string", "format": "date-time" }] "oneOf": [
{
"type": "null"
},
{
"type": "string",
"format": "date-time"
}
]
}, },
"falsification": { "falsification": {
"oneOf": [{ "type": "null" }, { "type": "string", "minLength": 1 }] "oneOf": [
{
"type": "null"
},
{
"type": "string",
"minLength": 1
}
]
} }
}, },
"patternProperties": { "patternProperties": {