diff --git a/CHANGELOG.md b/CHANGELOG.md index dcc2f40..dffd84e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,11 @@ # Changelog -Each entry records a versioned change to a specification in this repository. -Each specification is versioned independently, starting at version 1. Every -pull request that alters normative content bumps the affected spec's `Version` -field and adds an entry here. +Each entry records a change to a specification in this repository. Each +specification carries a `Version` field equal to its V0/V1/V2 compatibility +class (VERSIONING.md): `1` for a formalization compatible with the pre-spec +status quo, `2` once it is not backwards compatible. Entries are grouped under +the spec's current class. Every pull request that alters normative content adds +an entry here. ## OVOS-INTENT-1 — Sentence Template Grammar diff --git a/GLOSSARY.md b/GLOSSARY.md index 00a07fc..6eebc3d 100644 --- a/GLOSSARY.md +++ b/GLOSSARY.md @@ -16,23 +16,23 @@ open a PR adding it. | Term | Meaning | |------|---------| -| **Template** | A string in the OVOS-INTENT-1 grammar describing a set of sentences ([INTENT-1 §3](ovos-intent-1.md)). | -| **Expansion** | Resolving `(a\|b)` / `[x]` into a finite set of concrete sentences ([INTENT-1 §4](ovos-intent-1.md)). | -| **Sample / sample set** | A concrete sentence produced by expansion; the set of all of them for a template ([INTENT-1 §4](ovos-intent-1.md)). | -| **Slot** | A named placeholder `{name}` filled with a value rather than written out ([INTENT-1 §3.4, §5](ovos-intent-1.md)). | -| **Capture map** | The names→values mapping a match produces — slot names or vocabulary names as keys ([INTENT-3 §7](ovos-intent-3.md)). | -| **Resource file / role** | A skill's plain-text files: `.intent`, `.dialog`, `.entity`, `.voc`, `.blacklist` ([INTENT-2 §1](ovos-intent-2.md)). | -| **Vocabulary** | A named slot-free phrase set; the unit a keyword intent constrains over ([INTENT-3 §4.1](ovos-intent-3.md)). | -| **Occurrence** | A phrase appearing in an utterance as a contiguous whole-word subsequence ([INTENT-2 §4.3](ovos-intent-2.md), [INTENT-3 §4.1](ovos-intent-3.md)). | -| **Skill** | An app — a self-contained unit of assistant functionality ([INTENT-3 §1, §3](ovos-intent-3.md)). | -| **Skill id** | A skill's identifier, unique across the assistant ([INTENT-3 §3](ovos-intent-3.md)). | -| **Intent** | A developer-defined binding from a natural-language command to one handler ([INTENT-3 §1](ovos-intent-3.md)). | -| **Intent name / qualified name** | The intent's name, unique within its skill / the `skill_id:intent_name` pair ([INTENT-3 §3](ovos-intent-3.md)). | -| **Keyword intent / template intent** | The two definition methods — keyword constraints, or sentence templates ([INTENT-3 §2](ovos-intent-3.md)). | -| **Handler** | The code an intent triggers when its command is recognized ([INTENT-3 §1, §6](ovos-intent-3.md)). | -| **Intent engine** | A classifier + slot extractor: consumes definitions, identifies the triggered intent ([INTENT-3 §6.2](ovos-intent-3.md)). | -| **Orchestrator** | The component that coordinates intent matching and dispatch — owns the engines / pipeline plugins and routes match results to handlers ([INTENT-3 §6.1](ovos-intent-3.md)). Distinct from the messagebus (transport) and from individual engines / plugins. | -| **Registration** | Submitting an intent's definition and handler together, as one unit ([INTENT-3 §6.1](ovos-intent-3.md)). | -| **Message** | The unit of communication on the bus: a JSON object with `type`, `data`, `context` ([MSG-1 §2](ovos-msg-1.md)). | -| **Context** | The assistant-metadata object on a Message; an extensible JSON object whose keys are defined by companion specs ([MSG-1 §2.3](ovos-msg-1.md)). | -| **Session** | The per-conversation carrier in `context.session`; carries `session_id` (with `"default"` reserved for "originates from the device itself") and `lang` (the user's preferred language, distinct from any `data.lang` describing the payload's own language) ([MSG-1 §4](ovos-msg-1.md)). | +| **Template** | A string in the OVOS-INTENT-1 grammar describing a set of sentences ([INTENT-1 §3](intent-1.md)). | +| **Expansion** | Resolving `(a\|b)` / `[x]` into a finite set of concrete sentences ([INTENT-1 §4](intent-1.md)). | +| **Sample / sample set** | A concrete sentence produced by expansion; the set of all of them for a template ([INTENT-1 §4](intent-1.md)). | +| **Slot** | A named placeholder `{name}` filled with a value rather than written out ([INTENT-1 §3.4, §5](intent-1.md)). | +| **Capture map** | The names→values mapping a match produces — slot names or vocabulary names as keys ([INTENT-3 §7](intent-3.md)). | +| **Resource file / role** | A skill's plain-text files: `.intent`, `.dialog`, `.entity`, `.voc`, `.blacklist` ([INTENT-2 §1](intent-2.md)). | +| **Vocabulary** | A named slot-free phrase set; the unit a keyword intent constrains over ([INTENT-3 §4.1](intent-3.md)). | +| **Occurrence** | A phrase appearing in an utterance as a contiguous whole-word subsequence ([INTENT-2 §4.3](intent-2.md), [INTENT-3 §4.1](intent-3.md)). | +| **Skill** | An app — a self-contained unit of assistant functionality ([INTENT-3 §1, §3](intent-3.md)). | +| **Skill id** | A skill's identifier, unique across the assistant ([INTENT-3 §3](intent-3.md)). | +| **Intent** | A developer-defined binding from a natural-language command to one handler ([INTENT-3 §1](intent-3.md)). | +| **Intent name / qualified name** | The intent's name, unique within its skill / the `skill_id:intent_name` pair ([INTENT-3 §3](intent-3.md)). | +| **Keyword intent / template intent** | The two definition methods — keyword constraints, or sentence templates ([INTENT-3 §2](intent-3.md)). | +| **Handler** | The code an intent triggers when its command is recognized ([INTENT-3 §1, §6](intent-3.md)). | +| **Intent engine** | A classifier + slot extractor: consumes definitions, identifies the triggered intent ([INTENT-3 §6.2](intent-3.md)). | +| **Orchestrator** | The component that coordinates intent matching and dispatch — owns the engines / pipeline plugins and routes match results to handlers ([INTENT-3 §6.1](intent-3.md)). Distinct from the messagebus (transport) and from individual engines / plugins. | +| **Registration** | Submitting an intent's definition and handler together, as one unit ([INTENT-3 §6.1](intent-3.md)). | +| **Message** | The unit of communication on the bus: a JSON object with `type`, `data`, `context` ([MSG-1 §2](msg-1.md)). | +| **Context** | The assistant-metadata object on a Message; an extensible JSON object whose keys are defined by companion specs ([MSG-1 §2.3](msg-1.md)). | +| **Session** | The per-conversation carrier in `context.session`; carries `session_id` (with `"default"` reserved for "originates from the device itself") and `lang` (the user's preferred language, distinct from any `data.lang` describing the payload's own language) ([MSG-1 §4](msg-1.md)). | diff --git a/README.md b/README.md index 3898b64..b8eeaa5 100644 --- a/README.md +++ b/README.md @@ -87,33 +87,48 @@ below). Adoption is voluntary; conformance, once adopted, is not. ## Specifications +The **Version** column carries the V0/V1/V2 compatibility class +([VERSIONING.md](VERSIONING.md)): `1` for a formalization compatible with the +pre-spec status quo, `2` for one that is not backwards compatible. + ### Intent stack — what a skill defines | ID | Document | Version | Status | |----|----------|---------|--------| -| OVOS-INTENT-1 | [Sentence Template Grammar](ovos-intent-1.md) | 2 | Draft | -| OVOS-INTENT-2 | [Locale Resource Formats](ovos-intent-2.md) | 2 | Draft · [v3 in review (PR #4)](https://github.com/OpenVoiceOS/architecture/pull/4) | -| OVOS-INTENT-3 | [Intent Definition](ovos-intent-3.md) | 1 | Draft | -| OVOS-INTENT-4 | [Intent and Entity Registration](ovos-intent-4.md) | 2 | [Draft — in review (PR #9)](https://github.com/OpenVoiceOS/architecture/pull/9) | +| OVOS-INTENT-1 | [Sentence Template Grammar](intent-1.md) | 1 | Draft | +| OVOS-INTENT-2 | [Locale Resource Formats](intent-2.md) | 1 | Draft | +| OVOS-INTENT-3 | [Intent Definition](intent-3.md) | 1 | Draft | +| OVOS-INTENT-4 | [Intent and Entity Registration](intent-4.md) | 2 | Draft | ### Bus stack — how components talk | ID | Document | Version | Status | |----|----------|---------|--------| -| OVOS-MSG-1 | [Bus Message](ovos-msg-1.md) | 2 | Draft | -| OVOS-SESSION-1 | [Session Carrier Wire Shape](ovos-session-1.md) | 1 | Draft | -| OVOS-SESSION-2 | [Session Lifecycle and State Ownership](ovos-session-2.md) | 1 | Draft | +| OVOS-MSG-1 | [Bus Message](msg-1.md) | 1 | Draft | +| OVOS-SESSION-1 | [Session Carrier Wire Shape](session-1.md) | 1 | Draft | +| OVOS-SESSION-2 | [Session Lifecycle and State Ownership](session-2.md) | 1 | Draft | +| OVOS-BRIDGE-1 | [Bus Bridge and Opaque Relay](bridge-1.md) | 2 | Draft | ### Orchestrator stack — what processes utterances | ID | Document | Version | Status | |----|----------|---------|--------| -| OVOS-PIPELINE-1 | [Utterance Lifecycle and Pipeline](ovos-pipeline-1.md) | 2 | Draft | -| OVOS-TRANSFORM-1 | [Transformer Plugins](transformer.md) | 1 | [Draft — in review (PR #20)](https://github.com/OpenVoiceOS/architecture/pull/20) | -| OVOS-CONTEXT-1 | [Intent Context](intent-context.md) | 1 | [Draft — in review (PR #18)](https://github.com/OpenVoiceOS/architecture/pull/18) | -| OVOS-CONVERSE-1 | [Active Handlers and Interactive Response](converse.md) | 1 | [Draft — in review (PR #25)](https://github.com/OpenVoiceOS/architecture/pull/25) | -| OVOS-STOP-1 | [Stop Pipeline Plugin](ovos-stop-1.md) | 1 | [Draft — in review (PR #33)](https://github.com/OpenVoiceOS/architecture/pull/33) | -| OVOS-AUDIO-IN-1 | [Audio Input Service](ovos-audio-in-1.md) | 1 | Draft | +| OVOS-PIPELINE-1 | [Utterance Lifecycle and Pipeline](pipeline-1.md) | 2 | Draft | +| OVOS-TRANSFORM-1 | [Transformer Plugins](transformer.md) | 1 | Draft | +| OVOS-CONTEXT-1 | [Intent Context](intent-context.md) | 2 | Draft | +| OVOS-CONVERSE-1 | [Active Handlers and Interactive Response](converse.md) | 2 | Draft | +| OVOS-STOP-1 | [Stop Pipeline Plugin](stop-1.md) | 2 | Draft | +| OVOS-PERSONA-1 | [Persona Pipeline Plugin](persona.md) | 2 | Draft | +| OVOS-FALLBACK-1 | [Fallback Pipeline Plugin](fallback.md) | 2 | Draft | +| OVOS-COMMON-QUERY-1 | [Common Query Pipeline Plugin](common-query.md) | 2 | Draft | + +### I/O stack — input and output surfaces + +| ID | Document | Version | Status | +|----|----------|---------|--------| +| OVOS-AUDIO-IN-1 | [Audio Input Service](audio-in.md) | 2 | Draft | +| OVOS-AUDIO-1 | [Audio Output Service](audio-out.md) | 2 | Draft | +| OVOS-GUI-1 | [GUI Display Subsystem](gui-1.md) | 1 | Draft | Each spec carries its own scope statement, design rationale, and conformance section in its header. Open the document for the full @@ -157,12 +172,11 @@ request, never committed directly. Each PR that alters normative content **MUST**: -- bump the spec's `Version` field in its header; -- add a corresponding entry to [CHANGELOG.md](CHANGELOG.md). - -A version identifies an exact, citable state of a document, so -implementations and conformance results can name the version they -target. +- add a corresponding entry to [CHANGELOG.md](CHANGELOG.md); +- set the spec's `Version` field to its V0/V1/V2 compatibility class + (`1` for a backwards-compatible formalization, `2` once any change makes + the spec incompatible with the pre-spec status quo). The field is the + compatibility class, not a per-revision counter (VERSIONING.md). PRs that touch only the non-normative material — [APPENDIX.md](APPENDIX.md) and [appendix/](appendix/) files, diff --git a/VERSIONING.md b/VERSIONING.md new file mode 100644 index 0000000..8906efe --- /dev/null +++ b/VERSIONING.md @@ -0,0 +1,33 @@ +# Spec versioning policy + +Version numbers in this repository carry compatibility semantics anchored to +the pre-specification behavior of the OVOS stack: + +| Version | Meaning | +| --- | --- | +| **V0** | The de facto, undocumented status quo — the behavior the stack ships before a subsystem is formalized. V0 is never written down as a spec; it is the reference point. | +| **V1** | A formalization of behavior that is **compatible with V0**. A V0 component keeps working against a V1 implementation, even if degraded (missing optional fields, reduced guarantees, legacy namespaces honored). | +| **V2** | Behavior that is **not backwards compatible** with V0. Adopting it requires coordinated migration (e.g. the `legacy_namespace` configuration gate). | + +Until launch day, every spec in this repository MUST be classified as V1 or +V2. The classification is part of the spec header. Rules of thumb: + +- A spec that documents existing message flows, adds optional fields, or + introduces parallel namespaces while the legacy ones keep working → **V1**. +- A spec that renames or removes message types, changes payload semantics, or + requires consumers to change before producers (or vice versa) → **V2**. +- A single spec MAY contain V1 sections and V2 sections only if the V2 parts + are explicitly gated (configuration flag) and the ungated behavior is V1. + +Within a class, editorial revisions bump the spec's own revision number in +its header; compatibility class changes (V1 → V2) are a new spec version, not +a revision. + +## The 1.0 definition + +The compatibility classes define the project roadmap. The stack starts at V0 +(the undocumented status quo — beta). Each subsystem is formalized as V1, then +migrated to V2 where the spec demands incompatible change. **OVOS is fully +spec compliant when every subsystem operates on V2 — that state is the +"breakthrough" in "from beta to breakthrough", and it is the 1.0 release +criterion.** diff --git a/ovos-audio-in-1.md b/audio-in.md similarity index 98% rename from ovos-audio-in-1.md rename to audio-in.md index 71525f0..4cdd89b 100644 --- a/ovos-audio-in-1.md +++ b/audio-in.md @@ -1,6 +1,6 @@ # Audio Input Service Specification -**Spec ID:** OVOS-AUDIO-IN-1 · **Version:** 1 · **Status:** Draft +**Spec ID:** OVOS-AUDIO-IN-1 · **Version:** 2 · **Status:** Draft This specification defines the **audio input service** — the component that acquires audio, runs the pre-STT transformer chain, transcribes diff --git a/ovos-intent-1.md b/intent-1.md similarity index 100% rename from ovos-intent-1.md rename to intent-1.md diff --git a/ovos-intent-2.md b/intent-2.md similarity index 100% rename from ovos-intent-2.md rename to intent-2.md diff --git a/ovos-intent-3.md b/intent-3.md similarity index 100% rename from ovos-intent-3.md rename to intent-3.md diff --git a/ovos-intent-4.md b/intent-4.md similarity index 100% rename from ovos-intent-4.md rename to intent-4.md diff --git a/ovos-msg-1.md b/msg-1.md similarity index 100% rename from ovos-msg-1.md rename to msg-1.md diff --git a/ngi.png b/ngi.png index 13f4e9c..bfd401a 100644 Binary files a/ngi.png and b/ngi.png differ diff --git a/ovos-pipeline-1.md b/pipeline-1.md similarity index 100% rename from ovos-pipeline-1.md rename to pipeline-1.md diff --git a/ovos-session-1.md b/session-1.md similarity index 100% rename from ovos-session-1.md rename to session-1.md diff --git a/ovos-session-2.md b/session-2.md similarity index 100% rename from ovos-session-2.md rename to session-2.md diff --git a/ovos-stop-1.md b/stop-1.md similarity index 99% rename from ovos-stop-1.md rename to stop-1.md index e519890..0051fd4 100644 --- a/ovos-stop-1.md +++ b/stop-1.md @@ -1,6 +1,6 @@ # Stop Pipeline Plugin Specification -**Spec ID:** OVOS-STOP-1 · **Version:** 1 · **Status:** Draft +**Spec ID:** OVOS-STOP-1 · **Version:** 2 · **Status:** Draft This specification defines the **stop pipeline plugin** — a pipeline plugin that matches utterances expressing the user's intention to