spec: stop-1.md — recency-targeted stop (no escalation on silence), RECOMMENDED timeouts, shared_pipeline_id defined - #117
spec: stop-1.md — recency-targeted stop (no escalation on silence), RECOMMENDED timeouts, shared_pipeline_id defined#117JarbasAl wants to merge 1 commit into
Conversation
|
Warning Review limit reached
Next review available in: 36 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
…1.1 cites - divergences.md: drop the STOP-1 no-escalation entry — current dev stop-1.md §4.1 step 5 still escalates to global_stop on a silent poll; the entry described PR #117's proposed (draft, unmerged) behavior as if it were the shipped spec. Fix the dangling §9.4 cite for ovos.intent.unmatched to §9.3. - gaps.md: tighten the audio-inbound gap with an explicit AUDIO-IN-1 §1 capture-out-of-scope cite; narrow the bridge managing-mode race entry — BRIDGE-1 §3.4.2 already defines a MAY-fallback (inject on last known session), only the queue-vs-drop policy for a second overlapping utterance is open. - patterns.md / reference.md: fix the nonexistent <owner_id>.converse.response citation to the real <skill_id>.converse.pong (CONVERSE-1 §4.2). - rationale.md / reference.md §6.1: restore the MSG-1 v2 §2.1.1 section tag for the topic-naming-convention citation instead of the bare §2.1. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ECOMMENDED timeouts, shared_pipeline_id defined Squashed from: - spec: stop-1.md — positive-responder selection, head tie-break, self-exclusion, pong validity - spec: OVOS-STOP-1 — recency fallback instead of global escalation, RECOMMENDED ping timeout, shared_pipeline_id defined Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Refines OVOS-STOP-1 for internal purity and self-consistency (per-file split of the consistency audit).
Owner decision needed — coverage gap left open (F5)
Removing escalation-on-silence closes a destructive failure mode, but it opens a reachability gap that this PR does not close.
Non-skill actors — media playback, TTS, GUI — are reachable only through the
ovos.stopbroadcast (§5.3). They are not skills, so they never appear inactive_handlersand never answer the ping. Before this change, a silent ping round escalated toglobal_stopand the broadcast reached them. Now, if any skill is nominally listed inactive_handlersand stays silent, the stop targets that skill instead, and TTS keeps speaking.Two mitigations exist. Neither is implemented here; pick one and it goes into a follow-up.
active_handlers. Media, TTS and GUI would register activity inactive_handlersunder their own identifiers, making them ordinary recency candidates and ordinary ping responders. This changes whatactive_handlersmeans — it stops being a skill-activation record and becomes an activity record — and it touches PIPELINE-1 §7.1 stamping.ovos.stop(or a narrower broadcast) so non-skill actors still hear it. This keepsactive_handlersas it is but weakens the "silence is never destructive" property this PR establishes.Changes
Selection (§4.1)
skill_idis insession.blacklisted_skills, or when it names the stop plugin's ownpipeline_id. If no candidate survives at step 4 or step 5,matchreturnsNoneand the orchestrator continues to the next stage.activated_atwins; on a tie, the entry nearest the head ofactive_handlers— the most recently pushed. OVOS-PIPELINE-1 §7.1 is named as the single normative home of both the push mechanics and the tie-break; this spec only applies them. This replaces the previous "entry appearing latest in the list", which inverted PIPELINE-1's model.Recency-targeted stop, never escalation-by-silence (§4.1 step 5, §4.2, §5.1)
A generic stop with no positive pong responder falls back to the most recently activated remaining
active_handlersentry and MUST NOT escalate toglobal_stop.global_stopkeeps exactly two triggers: explicit global-stop vocabulary, and anactive_handlerslist that is empty or holds only the stop plugin's own entry.Pong validity (§4.2)
skill_idstring and acan_handleboolean. Missing or non-booleancan_handle(no truthy coercion) and askill_idthat does not match the emitting handler both mean not stoppable.skill_idwins; later pongs from thatskill_idare ignored; post-timeout pongs are ignored and the selection is final.can_handle: falseor remain silent" becomes "MUST NOT respondcan_handle: true" — the prohibition is the invariant; the two permitted behaviours are not.replyfrom the inbound utterance Message, and the pong viareplyfrom the ping (OVOS-MSG-1 §5.2). Both were previously left to inference.<shared_pipeline_id>and the post-global_stopstate (§3.1, §5.2, §6.2)global_stopis not a reserved intent_name, so PIPELINE-1 §7.1 stamps the stop plugin's own entry after the wipe. The committed post-dispatch state isactive_handlers == [<shared_pipeline_id> entry], not[]. §6.2 said "empty entirely", which was never the observable outcome.global_stopagain instead of dispatching<stop_plugin_id>:stopforever.Denylists (§6.3)
blacklisted_intentsentries are qualified<skill_id>:<intent_name>pairs (PIPELINE-1 §5.4); the bare-intent_name lead-in is corrected. The plugin-side MUST is noted as a deliberate strengthening of the orchestrator-side filter — it keeps a blacklisted target out of the recency selection instead of discarding the Match afterwards.Timeouts (§4.1)
Ping-pong window is a RECOMMENDED default of 0.5 s, SHOULD NOT exceed 1 s. The hardcoded window value no longer appears in prose.
Editorial
Rationale prose is removed from the normative sections (step-5 justification, the §5.2 converse aside, the §7 example pipeline listing). A cross-protocol note records that the pong boolean's field name is protocol-local:
can_handlehere and in FALLBACK-1,resultin CONVERSE-1,can_answerin COMMON-QUERY-1.Compatibility
Versionstays2. VERSIONING.md defines the field as the V0-compatibility class, which these edits do not change. The removal of escalation-on-silence is a behaviour change within version 2 and the CHANGELOG says so explicitly: an implementation built against the earlier text wipedactive_handlers,converse_handlersandresponse_modewhenever a pong was late; it now stops one skill instead.Cross-spec
Depends on OVOS-PIPELINE-1 landing the
activated_attie-break in §7.1 (nearest-the-head), which this spec cites rather than restates. GLOSSARY rows for the stop family follow this PR's final wording.🤖 Generated with Claude Code