You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
│ session = match.updated_session or session # §4.1, §4.2
@@ -673,6 +674,24 @@ consecutive-exception threshold. A dropped plugin behaves as if
673
674
absent; recovery is a deployment concern. The threshold and scope
674
675
(per-session or process-wide) are deployer-configurable.
675
676
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
+
676
695
### 6.3 Plugins do not see each other's matches
677
696
678
697
A plugin receives the same utterance every other plugin in the
@@ -895,6 +914,8 @@ Reservations currently in force:
895
914
|`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 |
896
915
|`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 |
897
916
|`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`|
898
919
899
920
This specification fixes only the registry mechanism (reservation
900
921
listing); the per-name semantics are owned by the reserving
@@ -1130,6 +1151,7 @@ audio-capable deployment.
1130
1151
|-------|------|----------|---------|
1131
1152
|`utterance`| string | yes | The natural-language response string. |
1132
1153
|`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. |
1133
1155
1134
1156
**Derivation and session propagation.** A handler **MUST** derive each
1135
1157
`ovos.utterance.speak` emission from the dispatch Message (§7) it
0 commit comments