Skip to content

OVOS-CONTEXT-1: Intent Context Specification#18

Draft
JarbasAl wants to merge 6 commits into
devfrom
spec/intent-context
Draft

OVOS-CONTEXT-1: Intent Context Specification#18
JarbasAl wants to merge 6 commits into
devfrom
spec/intent-context

Conversation

@JarbasAl
Copy link
Copy Markdown
Member

@JarbasAl JarbasAl commented May 24, 2026

Companion issue: #17

Summary

Defines session.intent_context — a session-scoped, decaying flat map that provides declarative gating and slot pre-population for intents, lifting Adapt's per-frame context into an engine-agnostic primitive.

What the spec covers

  • §2session.intent_context: flat map with entries {value, expires_at, turns_remaining}; field named intent_context (not context) to distinguish from Message.context
  • §3 — Key-encoded scope: bare key = shared; <skill_id>:<key> = private. skill_id is the universal handler identity (a plain skill's id or a pipeline plugin's pipeline_id)
  • §4 — Two-phase per-dispatch decay: pre-match prune (drop expired), post-match decrement of turns_remaining
  • §5 — Gates: requires_context (positive) and excludes_context (negative) with optional scope discriminator
  • §6 — Context-supplied captures: a gate key that names an intent slot is filled from the live entry's value when the utterance does not supply one
  • §7 — Bus surface: ovos.context.set / .unset / .clear / .list (with .list.response); orchestrator computes stored key from context.skill_id, rejects emissions missing it
  • §8 — Direct-mutation pathway between match-accept and dispatch-emit

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 24, 2026

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 01427397-718f-4d7e-974c-c5d682fbdc38

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch spec/intent-context

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

JarbasAl added a commit that referenced this pull request May 24, 2026
Per the new "dedicated APPENDIX PR" policy, consolidating the
prior-art and design-deviation notes from the OVOS-CONTEXT-1
(PR #18) and OVOS-TRANSFORM-1 (PR #20) work into this PR.
Those spec PRs are now scoped to their own spec files only;
the discussion / cross-spec touchups / in-tree prior art
all live here.

Adds to §4 Design rationale:
- "Intent context (CONTEXT-1)" — the Adapt-only origins, the
  two-scope (private/shared) formalization, jurebes /
  nebulento / palavreado as prior art for excludes_context,
  the engine-side §5.3 mutation pathway resolving the
  PIPELINE-1 §4.2 contradiction.
- "Transformer plugins (TRANSFORM-1)" — the architectural-
  pattern framing, intent transformers as the system-typing
  home, the nine concrete in-tree plugins as prior art, the
  ascending-vs-descending priority deviation called out,
  cancellation alignment with existing plugin convention,
  and the language disambiguation hierarchy mirroring current
  ovos-core code paths.

Removes from §7 Known gaps:
- "Intent context" bullet (formalized in CONTEXT-1).
- "The utterance-transformer chain" bullet (formalized in
  TRANSFORM-1).
@JarbasAl JarbasAl force-pushed the spec/intent-context branch from d44a1eb to 0a4a61e Compare May 26, 2026 13:38
JarbasAl added a commit that referenced this pull request May 26, 2026
Per the new "dedicated APPENDIX PR" policy, consolidating the
prior-art and design-deviation notes from the OVOS-CONTEXT-1
(PR #18) and OVOS-TRANSFORM-1 (PR #20) work into this PR.
Those spec PRs are now scoped to their own spec files only;
the discussion / cross-spec touchups / in-tree prior art
all live here.

Adds to §4 Design rationale:
- "Intent context (CONTEXT-1)" — the Adapt-only origins, the
  two-scope (private/shared) formalization, jurebes /
  nebulento / palavreado as prior art for excludes_context,
  the engine-side §5.3 mutation pathway resolving the
  PIPELINE-1 §4.2 contradiction.
- "Transformer plugins (TRANSFORM-1)" — the architectural-
  pattern framing, intent transformers as the system-typing
  home, the nine concrete in-tree plugins as prior art, the
  ascending-vs-descending priority deviation called out,
  cancellation alignment with existing plugin convention,
  and the language disambiguation hierarchy mirroring current
  ovos-core code paths.

Removes from §7 Known gaps:
- "Intent context" bullet (formalized in CONTEXT-1).
- "The utterance-transformer chain" bullet (formalized in
  TRANSFORM-1).
JarbasAl added a commit that referenced this pull request May 26, 2026
Split specs into intent / bus / orchestrator stacks. Add all 11
specs including in-review ones (INTENT-4 #9, INTENT-2 v3 #4,
TRANSFORM-1 #20, CONTEXT-1 #18, CONVERSE-1 #25). Add role-based
reading order.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
JarbasAl added a commit that referenced this pull request May 26, 2026
* docs: README — full spec-set refresh for the in-flight stack

Update the README to reflect the full spec set landing together:
the original intent stack (INTENT-1/-2/-3, MSG-1) plus the
in-flight specs (INTENT-4, SESSION-1, SESSION-2, PIPELINE-1,
TRANSFORM-1, CONTEXT-1, CONVERSE-1).

Changes:

- Specification table reorganised into three stacks — intent,
  bus, orchestrator — each with a one-paragraph narrative. This
  is the structure APPENDIX §1.2 already uses; the README now
  mirrors it for consistency.
- New 'Where to start' section with four reading-order paths
  matching common audiences: skill author, plugin author,
  orchestrator author, architecture surveyor. Addresses the
  'no clear entry point' friction first-time readers hit when
  the set went from 4 to 11 specs.
- New 'How this compares to other voice frameworks' section
  summarising APPENDIX §2's positioning (Home Assistant /
  hassil, Rasa, Alexa / Dialogflow, Rhasspy / Hermes, Wyoming).
  Brief; points at APPENDIX for detail.
- Reference-implementation section split: ovos-spec-tools
  covers the intent stack; bus and orchestrator stacks are
  acknowledged as not-yet-having-ground-up-reference-impl with
  pointer to APPENDIX §5 divergence catalogue.
- New 'Implementation status' section: clarifies the spec-set
  Draft→stable transition is tracked at #5; intent stack is
  most aligned with current ovos-core; known gaps cited from
  APPENDIX §7.
- Contributing section adds the one-file-per-PR rule (per
  AGENTS.md repo convention) and clarifies dev vs master
  targeting.
- Updated draft warning to reference APPENDIX §5 divergence
  catalogue and link to #5.

No normative-spec changes; README and supporting-metadata only.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* README: establish voice OS framing; add OS-analogy table

Replace "voice assistant ecosystem" opening with "voice operating
system" framing. Add "What a voice operating system is" section with
OS-analogy table (scheduler, IPC, shared memory, process supervision,
loadable modules, syscall ABI) and the portability consequence.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* README: full spec table — three stacks, open PR links

Split specs into intent / bus / orchestrator stacks. Add all 11
specs including in-review ones (INTENT-4 #9, INTENT-2 v3 #4,
TRANSFORM-1 #20, CONTEXT-1 #18, CONVERSE-1 #25). Add role-based
reading order.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
JarbasAl added a commit that referenced this pull request May 26, 2026
… PIPELINE-1 (#14)

* docs: APPENDIX — audit-driven corrections (pipeline + registration model)

Applies corrections found by auditing claims against actual OVOS
source code:

1. **§6.7 enable/disable_intent legacy names corrected** to the
   real `mycroft.skill.enable_intent` / `mycroft.skill.disable_intent`.

2. **§6.4 direct-bus-subscribe claim broadened** — verified the
   standard ovos-padatious-pipeline-plugin and
   ovos-adapt-pipeline-plugin both subscribe directly to
   registration topics, not just downstream plugins.

3. **§6.4 "side-effects during match" softened** — audit confirms
   the official match_* methods are already side-effect-free; the
   skill-activation emit is orchestrator-side, not plugin-side.
   Rule reframed as forward-looking discipline.

4. **§3 / §4 / §6.4: PIPELINE-1 *refines* the plugin model rather
   than *introducing* it.** OVOSPipelineFactory, pipeline_plugins
   dict, _PIPELINE_MIGRATION_MAP, and the official plugin set
   already exist. PIPELINE-1's actual contribution narrows to:
   formalizing the contract, `<owner_id>:<intent_name>`
   polymorphism, universal `ovos.utterance.handled` end-marker,
   and the renames.

5. **§3 / §4 / §6.4: tier convention is compatible, not a
   divergence.** From the bus each tier is already a distinct
   `pipeline_id` in `Session.pipeline`. How a Python plugin class
   internally serves multiple `pipeline_id`s (one class with
   match_high/medium/low methods, an orchestrator-side
   suffix-decoder, separate plugin instances, etc.) is
   implementation choice the spec does not constrain.

6. **§4 / §6.4: registrations-are-broadcast is compatible, not a
   divergence.** OVOS already broadcasts registrations on the
   bus; plugins already subscribe directly. INTENT-4 does not
   change this — it only renames topics into the `ovos.intent.*`
   namespace (see §6.7). Migration is a string replacement.
   What IS new is the orchestrator's passive registration index
   that backs `ovos.intent.list` / `.describe` — that's added as
   a separate §6.4 divergence ("new orchestrator responsibility,
   not a change to existing behaviour").

7. **§6.6 adds note on engine-specific introspection topics**
   (`intent.service.adapt.*`, `intent.service.padatious.get`) —
   plugin-defined surface; spec does not claim authority over
   them.

No spec-body changes; APPENDIX only.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: APPENDIX §6.4 — drop the "dissolution" divergence

Same logic as the broadcast-registrations correction: the
orchestrator already treats every loaded plugin uniformly, and
`IntentHandlerMatch.match_type` is an opaque string the plugin
chooses — nothing in current code prevents a plugin from setting
`match_type = "<pipeline_id>:<intent_name>"` and being dispatched
to itself. The `<owner_id>:<intent_name>` polymorphism PIPELINE-1
names is therefore already supported; the spec only writes down a
convention current code allows but does not document.

Design rationale around the polymorphism stays in §3/§4 — it is
useful explicit naming. But it is not a divergence and should not
sit in the divergence catalogue.

§6.4 now contains a single real divergence: the orchestrator's
new passive registration index backing `ovos.intent.list` /
`.describe`. Everything else in §6.4 is forward-looking
discipline or a workshop bug, not an architectural change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX: keep session.pipeline (revert the rename row)

PIPELINE-1 now keeps the existing `session.pipeline` field name
instead of renaming it to `pipeline_stages`. Drop the §6.2
rename row and revert the prose mentions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX §7: note utterance-transformer chain as a deferred spec (out of scope for PIPELINE-1)

* APPENDIX §4 / §7: design notes for OVOS-CONTEXT-1 and OVOS-TRANSFORM-1

Per the new "dedicated APPENDIX PR" policy, consolidating the
prior-art and design-deviation notes from the OVOS-CONTEXT-1
(PR #18) and OVOS-TRANSFORM-1 (PR #20) work into this PR.
Those spec PRs are now scoped to their own spec files only;
the discussion / cross-spec touchups / in-tree prior art
all live here.

Adds to §4 Design rationale:
- "Intent context (CONTEXT-1)" — the Adapt-only origins, the
  two-scope (private/shared) formalization, jurebes /
  nebulento / palavreado as prior art for excludes_context,
  the engine-side §5.3 mutation pathway resolving the
  PIPELINE-1 §4.2 contradiction.
- "Transformer plugins (TRANSFORM-1)" — the architectural-
  pattern framing, intent transformers as the system-typing
  home, the nine concrete in-tree plugins as prior art, the
  ascending-vs-descending priority deviation called out,
  cancellation alignment with existing plugin convention,
  and the language disambiguation hierarchy mirroring current
  ovos-core code paths.

Removes from §7 Known gaps:
- "Intent context" bullet (formalized in CONTEXT-1).
- "The utterance-transformer chain" bullet (formalized in
  TRANSFORM-1).

* APPENDIX: SESSION-1 rationale; introspection patterns; revised divergences

§4 — new 'Session (SESSION-1)' rationale subsection: why it exists,
   prescriptive-not-descriptive scope, omission-as-deferral
   semantics, four language signals.
§4 'Transformer plugins' — language-disambiguation note updated:
   hierarchy moved out of TRANSFORM-1 to SESSION-1 §3.2; transformer
   types now just named as natural producers of signals,
   consolidation is consumer's stage-dependent choice.
§6.4 architectural divergences — add: handler-trio ownership shifted
   to orchestrator (third-party handler code carries no obligation);
   per-pipeline_id intent introspection (PIPELINE-1 §10); CONTEXT-1
   scope discriminator. Update ovos.utterance.handled note to
   reflect the trio-ownership shift (workshop fix is now in the
   wrapper, not the handler).
§6.5.1 (new) — introspection-patterns table comparing INTENT-4,
   PIPELINE-1, CONTEXT-1, TRANSFORM-1 surfaces. Three shared
   properties (pull-query is source of truth, no completeness
   signal, per-process slices under split orchestrators). Notes
   naming-convention inconsistency as candidate follow-up.
§6.6 — remove obsolete 'session shape deferred' note; replace with
   SESSION-1 ownership statement.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX: update §6.5.1 topic-naming (resolved); add new §6.4 divergences

§6.5.1: topic-naming inconsistency is now resolved — all four .list
   surfaces use ovos.<domain>.<verb>. Update the table and replace
   the 'not yet uniform' note with a rename log.
§6.4: add four new divergence entries:
   - Skill self-identification on every emission (INTENT-4 §3.1)
   - recognizer_loop:utterance de-prescribed (PIPELINE-1 §9.1)
   - .list topics standardized
   - (keeps the existing scope-discriminator / handler-trio /
     per-pipeline_id / utterance.handled entries)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX: cleanup — drop draft-history meta-commentary

Stand-alone design notes, not a changelog.

§4 design rationale: rewrite Session block and TRANSFORM-1 lang
   bullet to describe current design, not 'moved from earlier draft'.
§6.4 divergences: rewrite handler-trio / trio-ownership / scope-
   discriminator / skill_id-emission / recognizer_loop /
   topic-naming entries to state current design, not contrast with
   earlier drafts.
§6.5.1 introspection patterns: drop 'in this round' rename note.
§9 (rewritten 'Design history' → 'The spec set, in three stacks'):
   drop §9.3 audit-driven-refinement entirely (changelog content);
   merge §9.1 + §9.2 into one tighter section about how the eight
   specs partition and what reference implementations exist.
§10 compatibility levels: soften 'was previously spoken of at' to
   'is spoken of at'; replace the 'no longer describes' framing
   with a forward-looking 'tuple covering all eight specs is a
   planned follow-up'.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX: update divergence catalog for CONTEXT-1 key-shape collapse + dispatch stamping

§6.4: rewrite the CONTEXT-1 scope-discriminator entry to reflect
   the bigger change — scope AND origin both collapsed into the
   key shape. requires_context discriminator is the surviving
   surface (default private).
§6.4: rewrite the skill_id-on-every-emission entry to lead with
   the structural enforcement (dispatch stamping + forward/reply
   inheritance), with loader interception as a follow-up rather
   than the primary path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX: clarify topic-naming claim as prefix-uniform, verb depth varies

* APPENDIX §6.5.1: flag the 'intent' word collision across three introspection topics

Cross-spec audit B1: 'intent' plays three different roles across
the four-spec introspection table — registered intents (INTENT-4),
compiled-in-a-matcher intents (PIPELINE-1), and intent-transformer
plugins (TRANSFORM-1). The shapes are deliberate and the payloads
are distinct, but the topic strings read confusingly at a glance.
Added an informative paragraph naming the three meanings and
clarifying that ovos.transformer.intent.list follows the per-chain
ovos.transformer.<type>.list pattern, where 'intent' is the chain
type — not a listing of intents.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX §4 Transformer: design note on the six per-type self-identification keys

Document the rationale for TRANSFORM-1 §1.3 claiming six per-type
context keys (audio_transformer_id, utterance_transformer_id, ...)
rather than a single generic transformer_id. Two arguments: (1)
role preservation across the six-stage chain, mirroring the
per-type partition that already exists in §1.1 registries, §5
session overrides, and §6 introspection topics; (2) multi-type-
plugin disambiguation, since §1.1 permits a single transformer_id
across types and a generic context key would erase the role at
emit time.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX §4 Transformer: record list-valued attribution, denylist symmetry, and the per-type field-count tradeoff

Four design notes capturing the recent TRANSFORM-1 evolution:

- Update the existing per-type self-id bullet to reflect the
  plural list-valued context keys (audio_transformer_ids etc.,
  not the older singular names).
- New bullet: list-valued attribution preserves full chain
  provenance per type; the last entry is the most-recent stamp.
  Skills and pipelines stay single-string because they originate
  rather than chain.
- New bullet: per-type denylists (six blacklisted_*_transformers)
  complete the policy surface, mirroring PIPELINE-1's
  pipeline/blacklisted_pipelines pair. Three-stage composition
  (preference → availability → policy) parallels PIPELINE-1 §5.5.
- New bullet: acknowledge the per-type 'explosion' (12 session
  fields + 6 context keys), defend the choice against the
  transformer_<type>:<name> prefix-encoding alternative (direct
  lookup vs prefix parsing), note that SHOULD-omit makes the
  common case zero-cost on the wire, and document the
  object-valued form as a clean fallback if the field count ever
  proves painful in practice.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX §4 CONTEXT-1: rationale for default-private scope

Add design-rationale paragraph explaining why ovos.context.set
defaults to private scope when the canonical worked example
(Person → Bob) is naturally cross-skill. Three reasons: migration
fidelity (current Adapt set_context is effectively skill-private),
safer footgun direction (accidental shared-leak is harder to
debug than accidental cross-skill miss), and authorability
(cross-skill coordination deserves a conscious explicit scope).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX §6: record recognizer_loop:utterance -> ovos.utterance.handle rename

Move the entry-topic from §6.1 'already aligned' to §6.4
'architectural divergences' — it is no longer a name kept
verbatim, since PIPELINE-1 §9.1 now prescribes
ovos.utterance.handle. Rationale paragraph cites the three
MSG-1 §2.1.2 naming convention violations: ':' as separator,
implementation-role leading segment, missing request/terminal
verb pairing.

Migration cost spelled out (every audio-input service emits,
every intent-service handler subscribes: ovos-dinkum-listener,
ovos-simple-listener, ovos-audio, ovos-core/intent_services).

§6.7 predecessor-topic table updated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX: §2.5 Rasa/hassil/ASK/Mycroft comparisons; §6.5.2 session-field + stamp-rule cheat-sheets

Two informative additions:

- §2.5 (new): extends the §2 comparison set with Rasa, hassil,
  ASK / Dialogflow, and Mycroft. Locates the CONTEXT-1 design
  against Rasa's policy-engine-coupled forms; locates
  TRANSFORM-1 §3.4 against ASK/Dialogflow built-in entity types
  as the injectable open contract; documents Mycroft as the
  predecessor whose ad-hoc model the spec family formalizes.

- §6.5.2 (new): session-field cheat-sheet consolidating the 26
  fields claimed across SESSION-1, PIPELINE-1, TRANSFORM-1, and
  CONTEXT-1 into a single reference table — owner spec, role
  (preference / policy / signal / identity), empty-array
  semantics. Followed by a stamp-rule cheat-sheet covering the
  three component-identity context-key surfaces (skill_id,
  pipeline_id, <type>_transformer_ids) and their behaviour
  across origination, .reply / .response, and .forward.

Both reduce cross-spec bouncing for implementers.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX: reorganize from 10 sections to 7, restructure for flow

The appendix had become a dumping ground after multiple rounds
of additions. Restructured with clear narrative flow:

§1 About the OVOS specifications — formalization framing,
   the three-stack overview (was §9), compatibility levels
   (was §10), reference implementations + ecosystem tooling
   (folds in ovos-spec-tools from §9 and ovos-localize from §8).

§2 Comparison with other voice-assistant systems — merges
   the HA/Rhasspy material (was §2) with the Rasa/ASK/
   Dialogflow/Mycroft/hassil material (was §2.5) into a
   single comparator section, ordered by relevance: HA &
   Rhasspy (shared lineage) → open-vs-closed structural
   argument → Mycroft (predecessor) → Rasa (CONTEXT-1
   comparator) → ASK/Dialogflow → hassil (grammar-only) →
   summary of where OVOS leads/follows/differs.

§3 Architectural patterns — the bus as substrate (was §5)
   and the pipeline-plugin model (was §3) grouped as the
   two cross-cutting architectural moves. Bus-substrate
   section gains an explicit subsection on the layer-2
   authorization story (preference / policy split).

§4 Design rationale, per specification — was §4 itself but
   now systematically per-spec (INTENT-1+2+3 grouped,
   MSG-1, SESSION-1, INTENT-4, PIPELINE-1, CONTEXT-1,
   TRANSFORM-1). Stale references purged; recently added
   rationales (most-specific-wins precedence, bidirectional
   lang propagation, per-type denylists, etc.) folded in.

§5 Where the specs differ from current OVOS code — was §6
   but reorganized: removed the §6.5.1 introspection-
   patterns table and §6.5.2 cheat-sheets (they aren't
   divergences from code, they're implementer reference —
   moved to §6). Renumbered to §5.1–§5.7.

§6 Implementer reference — new top-level section gathering
   the cross-spec reference tables that were scattered:
   topic-name conventions (with the 'intent' overload
   clarification), session-field cheat-sheet,
   component-identity stamp-rule cheat-sheet, introspection
   patterns table. These don't belong inside a 'divergences
   from code' section; they're how-to material for fresh
   implementers.

§7 Known gaps and planned work — unchanged content, last
   section. Trimmed stale entries about CONTEXT-1 and
   TRANSFORM-1 as 'planned' (they've shipped); added
   conversation-level evaluation infrastructure as a gap.

Net: same content, far more navigable. Cross-references
updated throughout.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX §2: drop Mycroft comparator subsection; renumber 2.4-2.7 to 2.3-2.6

Mycroft AI Inc shut down in 2023; the fork is years old and the
intervening design is not Mycroft's. Keeping a 'comparison to
predecessor' subsection over-attributes the architecture and
mis-frames OVOS as a derivative project rather than a long-
running open project in its own right.

Section §2 is now a comparison with currently-relevant
voice-assistant systems only:

- §2.1 Home Assistant and Rhasspy (shared grammar lineage)
- §2.2 Closed domain vs open ecosystem
- §2.3 Rasa
- §2.4 Amazon ASK / Google Dialogflow
- §2.5 hassil
- §2.6 Summary

Collateral: dropped Mycroft from the project-name list in the
intro and from the comparator enumeration in the §2.6 summary.
Legacy topic strings that happen to contain 'mycroft' in their
literal name remain in the §5 divergence tables and §5.7
predecessor-topic mapping as factual code references.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX §3.3: external-protocol interoperability injection points

Make the family's interop story explicit rather than implied. New
§3.3 catalogues three injection points where external protocols
plug into the spec family:

1. Pipeline plugins as the dispatch-layer adapter — LLM APIs
   (OpenAI Chat Completions and compatible), deterministic
   template matchers (hassil), external intent classifiers,
   agent-tool protocols (MCP).
2. Transformer chains as the artifact-pipeline adapter —
   bidirectional translation, STT validators, content-policy
   filters, acoustic-event detectors.
3. Bus boundary as the wire-level adapter — Wyoming
   bridges, MQTT-based stacks, HiveMind-style layer-2
   substrates.

Per-protocol notes for Wyoming, OpenAI, MCP, hassil, MQTT,
A2A — naming where each plugs in. The single-flip routing and
no-central-state stance (§3.1) are what make the bus-boundary
adapter feasible without modifying the assistant core.

Concrete suggestion: a translation tool between OVOS-INTENT-2
locale resources and HA's hassil/intents YAML would let the
two corpora cross-pollinate mechanically. Added to §7 known
gaps as planned tooling.

The three injection points are intentionally not exhaustive —
they're the points the spec family deliberately keeps clean. A
protocol needing deeper integration is a signal of
architectural overlap rather than complementarity.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX: add CONVERSE-1 to orchestrator-stack narrative; close multi-turn gap

OVOS-CONVERSE-1 (PR #25) fills the multi-turn conversation gap that §7 previously listed as planned work. Update §1.2 stack description to include it, and drop the §7 gap entry.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX §5.3, §5.4: update for PIPELINE-1 §4.2 relaxation + §7.0 polymorphism collapse

Two divergence-catalogue entries updated to reflect the
PIPELINE-1 restructure:

- The §5.4 'side-effect-free during match' entry is rewritten
  as 'match contract is the single obligation' — match's only
  MUST is returning Match-or-null; bus emissions during match
  are allowed; session mutation during match is via
  Match.updated_session (explicit channel).

- New §5.4 entry: 'Match.updated_session as the match-phase
  session channel' — promotes the existing ovos-core code
  pattern `sess = match.updated_session or
  SessionManager.get(message)` to a normative Match field.
  Claiming plugin's mutations land; declined plugin's
  mutations drop at the boundary.

- The §5.3 'Dispatch payload uses polymorphic owner_id' entry
  is rewritten as 'unified owner_id' — reflects PIPELINE-1
  §7.0's collapse to two handler-owner shapes (plain skill,
  pipeline plugin with bundled handlers where pipeline_id ==
  skill_id) plus the pure-matcher recognition. Notes the
  conceptual mapping skill_id ≈ voice_app_id, pipeline_id ≈
  matching-engine id.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX §1.2, §7: SESSION-2 fills the lifecycle gap

OVOS-SESSION-2 (in flight at PR #27) defines session lifecycle
and state ownership. Update:

- §1.2 orchestrator-stack narrative adds SESSION-2 to the stack
  description with one-line summary of its scope (stateless
  orchestrator for named sessions, orchestrator-owned default
  session, projection mandate).

- §7 gap entry rewritten: SESSION-2 lands the lifecycle piece;
  what remains deferred is the set of session preference fields
  that need to be claimed under SESSION-1 §2.1 by their owning
  specs (preferences / OCP / persona / locale).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX §1.2: SESSION-2 narrative — SHOULD-project + MAY-internal (not 'mandate')

Sync with SESSION-2 §2.4 relaxation (commit 6a882c8). The
projection pathway is SHOULD-when-practical; plugins MAY hold
internal state with full lifecycle ownership and best-effort
resumption.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* APPENDIX §5.2.1: document ovos.session.sync / update_default for removal

These ovos-core topics are not defined by any spec. SESSION-2 §6.4
explicitly avoids naming them. They should be retired in favour of
clients reading session state from normal Message flow
(ovos.utterance.handled or any other session-carrying Message).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* README + APPENDIX §1.0: establish voice OS framing

README intro replaced: "voice assistant ecosystem" → "voice
operating system" with an OS-analogy table (scheduler, IPC,
shared memory, process supervision, loadable modules, syscall ABI).

APPENDIX §1.0 (new): The voice operating system concept — two
conflations addressed: (1) voice assistant product (closed,
vertically integrated vs open platform); (2) LLM wrapper (LLMs
fit as pipeline plugins, utterance/dialog/metadata transformers —
one possible multi-role deployment, not the architecture itself).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* revert: move README voice-OS framing to its own PR (#28)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* APPENDIX: fix stale PIPELINE-1 refs; slim redundant prose

- owner_id → skill_id throughout (§3.2, §3.3, §4.5, §4.6)
- match(utterance,…) → match(utterances,…) (§4.5)
- Match.captures → Match.slots (§4.7)
- complete_intent_failure → ovos.intent.unmatched in §5.1/§5.3/§5.7;
  add rename row to §5.2 table
- Dispatch payload block in §5.3 rewritten: {lang, utterance, slots},
  handler-lifecycle uses {skill_id, intent_name, optional exception}
- §5.5: add ovos.intent.unmatched and ovos.utterance.speak entries
- §2.5 hassil: drop standalone subsection; fix §2 intro cross-ref
- §1.3 compat levels: condense to bullets
- §1.4: drop ovos-localize "honest notes" paragraph
- §3.1.3: trim to essential bus-substrate mechanics
- §4.7: trim per-type-explosion and per-type-self-id bullets
- §5.4: trim rename and match-contract entries

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…tive

Defines session.intent_context — a flat map of key→{value, expires_at,
turns_remaining} entries that declaratively gate intent recognition without
cross-skill coupling. Covers:

- Private keys (<skill_id>:<key>) and shared bare keys
- Decay by turns_remaining (decremented each utterance) and expires_at (absolute TTL)
- Four bus events: ovos.context.set / .unset / .clear / .list
- Direct session mutation pathway via Match.updated_session (PIPELINE-1 §4.2)
- Conformance roles for orchestrator, pipeline plugins, transformers, skills

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@JarbasAl JarbasAl force-pushed the spec/intent-context branch from 0a4a61e to 387125e Compare May 28, 2026 05:35
JarbasAl and others added 5 commits May 28, 2026 06:50
- §1.1, §7, §8: Match.captures/data.captures → Match.slots/data.slots
  (PIPELINE-1 uses slots throughout; captures was wrong)
- §2: cap eviction criterion — specify "closest to natural expiry"
  instead of undefined "oldest"
- §5.1: timer re-supply guidance — note there is no read-back API;
  callers must supply the desired timer explicitly at set-time
- §3.1: remove duplicated "safe default" paragraph (restated in §6)
- §4.1: "inside the dispatch sequence" → cite PIPELINE-1 §6.1 window
- §5.3: drop redundant "outside match MUST" (already in PIPELINE-1 §4.2)
- §8: "expose to matchers" → "pass post-decay session to match() call"
- §8: "enforce SHOULD-NOTs by logging" → correct RFC 2119 level wording

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Mutation points are now exactly:
  §5.1 pipeline plugin — Match.updated_session (pre-dispatch)
  §5.2 transformer — in-place during hook
  §5.3 skill/handler — ovos.session.sync (SESSION-2 §2.7)

Removed: ovos.context.set / .unset / .clear bus events and the
eight-level component-identity precedence machinery that served
them. Skills now write keys directly into their local session copy
and sync back via ovos.session.sync; the orchestrator merges
field-level per SESSION-2.

Removed: ovos.context.clear (footgun — any skill could wipe the
full session context). Scope discipline is now the emitter's
responsibility; no orchestrator-side key computation needed.

Updated §3 intro, §3.2 examples, §4.1, §8 conformance, §9 trust
section, and the spec intro throughout to match.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- §5.3: entry-level merge for ovos.session.sync — present keys set/replace,
  null entries delete, absent keys untouched; eliminates concurrent-handler
  write-conflict; private-scope keys naturally disjoint by owner
- §8: orchestrator conformance updated to match entry-level merge semantics;
  reword "outside pathways" MUST to name what read-only means concretely
- §4: turns: 1/0 → turns_remaining: 1/0 throughout (bus-event field name gone)
- §4: explicit note that no-match utterances still decrement turns_remaining;
  stated as intentional design; suggest transformer pathway for custom policy
- §2.1: in_confirmation example changed to tea.skill:in_confirmation (private);
  bare key was teaching the wrong scope for confirmation-flag pattern
- §2: key naming conventions — shared keys RECOMMENDED lowercase_underscore
- §5.2: transformer_id → "transformer's own identifier (per OVOS-TRANSFORM-1)"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rding

- §4: remove incorrect "implement as transformer" escape hatch for
  no-match decrement policy; no TRANSFORM-1 hook runs post-decrement
- §5 intro: transformer_id → "transformer identifier per OVOS-TRANSFORM-1"
- §6 examples: Person → person to match lowercase naming convention
- §6 normative text: requires_context: [Person] → [person]
- §7: "declares the shared key" → "declares the key" (fill rule is
  scope-agnostic); Person: Bob → person: "Bob"
- §8: "defer to next decay tick" → precise timing wording from §4.1

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@JarbasAl JarbasAl changed the title OVOS-CONTEXT-1: Intent Context Specification (draft) OVOS-CONTEXT-1: Intent Context Specification May 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant