Skip to content

Commit 2c42e43

Browse files
committed
PIPELINE-1: required_slots backstop, reserve fallback/common_query, listen field
1 parent 54c6a0e commit 2c42e43

2 files changed

Lines changed: 43 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,24 @@ tool does not recognize the token and cannot expand the template.
9999
the rejecting topic. File paths never cross the bus — INTENT-2 locale
100100
files are a producer-side authoring convenience expanded inline by
101101
the skill loader before emission.
102+
103+
## OVOS-PIPELINE-1 — Utterance Lifecycle and Pipeline
104+
105+
### 2
106+
107+
- §6.2 — the orchestrator treats a `Match` as declined when any slot
108+
listed in the intent's `required_slots` (OVOS-INTENT-3 §5.3) is absent,
109+
behind the engine's own enforcement during `match`.
110+
- §7.3 — reserve the intent_names `fallback` (OVOS-FALLBACK-1 §6.3) and
111+
`common_query` (OVOS-COMMON-QUERY-1 §3).
112+
- §9.6 — the OPTIONAL `listen` field on `ovos.utterance.speak`: when
113+
`true`, the output stage re-opens the user input channel after the
114+
response is delivered.
115+
116+
### 1
117+
118+
- The utterance lifecycle, the pipeline-plugin `match` contract, the
119+
session fields owned by this specification (§5), dispatch (§7), the
120+
handler-lifecycle trio (§8), and the utterance-layer topics — the
121+
entry point `ovos.utterance.handle` (§9.1) and the response exit point
122+
`ovos.utterance.speak` (§9.6).

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)