Skip to content

Commit d47ed79

Browse files
JarbasAlclaude
andcommitted
PIPELINE-1: required_slots backstop, reserve fallback/common_query, listen field
Consolidates the PIPELINE-1 companion edits previously bundled into the union-slots (#56), FALLBACK-1 (#39), COMMON-QUERY-1 (#40) and AUDIO-1 (#38) feature PRs into a single one-file change to ovos-pipeline-1.md. - §6.1/§6.2 — orchestrator backstop for required_slots (INTENT-3 §5.3): the orchestrator treats a Match as declined if any required slot is absent. Second line of defense behind engine-side enforcement. - §7.3 — reserve intent_names "fallback" (FALLBACK-1 §6.3) and "common_query" (COMMON-QUERY-1 §3). COMMON-QUERY-1 asserted the reservation but never registered the row; this closes that gap. - §9.6 — add the OPTIONAL listen field to ovos.utterance.speak; the output-side behaviour is owned by AUDIO-1. All additions are backwards-compatible. PIPELINE-1 is already V2 (its namespaced topics replace the pre-spec names); these refinements do not change the class, so the Version stays 2. Adds the missing PIPELINE-1 CHANGELOG section. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent b63b031 commit d47ed79

2 files changed

Lines changed: 44 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,25 @@ tool does not recognize the token and cannot expand the template.
9797
the rejecting topic. File paths never cross the bus — INTENT-2 locale
9898
files are a producer-side authoring convenience expanded inline by
9999
the skill loader before emission.
100+
101+
## OVOS-PIPELINE-1 — Utterance Lifecycle and Pipeline
102+
103+
### 2
104+
105+
The spec is at compatibility class **V2**: its namespaced utterance-layer
106+
topics (`ovos.utterance.handle` entry, the §7 dispatch / §9 topic family)
107+
replace the pre-spec status-quo names, so a V0 component is not
108+
wire-compatible without migration. The following are backwards-compatible
109+
additions consumed by the in-flight pipeline-plugin specs, recorded here
110+
per the 1-file-1-PR rule:
111+
112+
- §6.2 — orchestrator backstop for `required_slots` (INTENT-3 §5.3):
113+
after a plugin returns a Match, the orchestrator MUST treat the match
114+
as declined if any required slot is absent. Second line of defense;
115+
the engine enforces `required_slots` primarily during `match()`.
116+
- §7.3 — reserve two further intent_names in the registry: `fallback`
117+
(OVOS-FALLBACK-1 §6.3) and `common_query` (OVOS-COMMON-QUERY-1 §3).
118+
- §9.6 — add the OPTIONAL `listen` field to the `ovos.utterance.speak`
119+
payload: when `true`, the output stage re-opens the user input channel
120+
after delivery. The output-side behaviour is defined by the output-path
121+
companion spec.

ovos-pipeline-1.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,7 @@ ovos.utterance.handle ← entry (§9.1)
593593
│ continue # any plugin-side updated_session is discarded
594594
595595
│ orchestrator-backstop denylist check (§5.3/§5.4)
596+
│ orchestrator-backstop required_slots check (§6.2)
596597
│ if filtered: continue
597598
598599
│ session = match.updated_session or session # §4.1, §4.2
@@ -673,6 +674,24 @@ consecutive-exception threshold. A dropped plugin behaves as if
673674
absent; recovery is a deployment concern. The threshold and scope
674675
(per-session or process-wide) are deployer-configurable.
675676

677+
**Orchestrator backstop for `required_slots`.** After a plugin
678+
returns a `Match`, the orchestrator **MUST** verify that the match's
679+
slot map contains every slot listed in the intent's `required_slots`
680+
(INTENT-3 §5.3). The orchestrator obtains this information from the
681+
same registration data the plugin consumed — in-process, this is
682+
available from the plugin's compiled state or from the orchestrator's
683+
own manifest (INTENT-4 §10). If any required slot is absent, the
684+
orchestrator **MUST** treat the match as if the plugin had declined
685+
and continue iteration to the next plugin. This check operates
686+
after the `blacklisted_skills` / `blacklisted_intents` backstop
687+
(§5.3, §5.4) and uses the same observable semantics: no bus event
688+
is emitted; it is observable only as a non-match.
689+
690+
The primary obligation to enforce `required_slots` still lies with
691+
the engine during `match()`. The orchestrator backstop is a
692+
second line of defense against engine bugs or plugins that do not
693+
implement the rule.
694+
676695
### 6.3 Plugins do not see each other's matches
677696

678697
A plugin receives the same utterance every other plugin in the
@@ -895,6 +914,8 @@ Reservations currently in force:
895914
| `converse` | OVOS-CONVERSE-1 §4 | a converse plugin's claim that `<skill_id>` (an active handler) wants this utterance — the orchestrator dispatches `<skill_id>:converse` and the owner's converse handler runs |
896915
| `response` | OVOS-CONVERSE-1 §5 | a converse plugin's signal that `<skill_id>` (the response-mode holder) is to receive the awaited utterance — the orchestrator dispatches `<skill_id>:response` and the owner's response handler runs |
897916
| `stop` | OVOS-STOP-1 §4 | a stop plugin's claim that `<skill_id>` (an active handler) should cease activity — the orchestrator dispatches `<skill_id>:stop` and the owner's stop handler runs |
917+
| `fallback` | OVOS-FALLBACK-1 §6.3 | a fallback plugin's claim that `<skill_id>` (a registered fallback handler) is willing to handle the utterance — the orchestrator dispatches `<skill_id>:fallback` and the handler runs |
918+
| `common_query` | OVOS-COMMON-QUERY-1 §3 | a common-query plugin's self-addressed match (`Match.skill_id` is the plugin's own `pipeline_id`) — the orchestrator dispatches `<pipeline_id>:common_query` and the plugin's bundled handler speaks the answer it selected during `match` |
898919

899920
This specification fixes only the registry mechanism (reservation
900921
listing); the per-name semantics are owned by the reserving
@@ -1130,6 +1151,7 @@ audio-capable deployment.
11301151
|-------|------|----------|---------|
11311152
| `utterance` | string | yes | The natural-language response string. |
11321153
| `lang` | string | no | BCP-47 tag of the response language. When absent, the output stage resolves language from the session per OVOS-SESSION-1 §3.2. |
1154+
| `listen` | bool | no | When `true`, the handler expects a follow-up utterance after this response is delivered; the output stage re-opens the user input channel once delivery completes. Absent or `false` means no follow-up is expected. The output-side behaviour this triggers is defined by the output-path companion specification. |
11331155

11341156
**Derivation and session propagation.** A handler **MUST** derive each
11351157
`ovos.utterance.speak` emission from the dispatch Message (§7) it

0 commit comments

Comments
 (0)