OVOS-PERSONA-1: Persona Pipeline Plugin Specification#37
Draft
JarbasAl wants to merge 7 commits into
Draft
Conversation
Conceptual definition of a persona as a complete conversational agent, with summon/dismiss interaction rules, no-persona mode, pipeline-positioning constraints, and an out-of-band query interface. - §2: conceptual definition (identity, personality, capabilities) - §3: persona_id session field (matching existing Session.persona_id) - §4: no-persona mode (deterministic pipeline without persona) - §5: summon rules (activating a persona by setting persona_id) - §6: dismiss rules (deactivating via stop cascade or mutation) - §7: simplified match contract (check persona_id, consume all) - §8: handler contract, multi-turn via converse, out-of-band query - §9: multiple persona coexistence (identity namespace, selection) - §10: pipeline positioning (skills and stop before persona) - §11: bus surface - §12: conformance Co-Authored-By: big-pickle <big-pickle@opencode.ai>
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ 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 |
…edded commands, discovery, default persona, register/deregister - §5: self-summon and external-summon pathways; one-off query (ask) as non-activating embedded command; unknown persona query rule - §6: self-release via match added to dismiss pathways - §7.1: two-phase match — route 1 (embedded commands) before route 2 (persona_id catch-all) - §7.2, §7.5: updated for broader route 1 - §8.5: added rationale for out-of-band query - §8.7 (new): persona discovery (ovos.persona.list / .list.response) - §4: default persona deployment note - §9: dynamic register/deregister (ovos.persona.register / .deregister) - §11: bus surface table extended - §12: conformance updated for discovery (SHOULD) and register/deregister (MAY) - Cross-reference fix: §8.5→§8.6 in conformance stop item - §3, §4: softened absolute MUST-return-None to allow embedded commands Co-Authored-By: Claude Code <claude@anthropic.com>
Bugs fixed: - §6: "client by omitting persona_id" is wrong (omission ≠ clearing per SESSION-1 §4); corrected to explicit clearing. Stop-cascade dependency demoted from normative SHOULD on STOP-1 to informative deployment note. - §5: "summon MUST reference existing persona_id" contradicts self-summon (which creates the identity); replaced with "unknown persona falls through" - §9: MUST NOT duplicate persona_id vs. "multiple stages share same id" contradiction resolved — demoted to SHOULD NOT, behaviour described correctly - §8.6: SHOULD check + MUST cease → both MUST (the MUST was conditional on the SHOULD, making it toothless) - §8.3: add listen:true requirement on multi-turn speak prompt (CONVERSE-1 §5.1); explain why converse routes to persona (skill_id == pipeline_id) Underspecified fixed: - §8.5: add response payload table with field definitions; add source requirement for reply() routing; note on broadcast noise and mitigation - §8.4: remove suggested persona_context field name (not in SESSION-1 registry); require plugin-specific namespaced name claimed in registry - §11: add ovos.persona.activated / ovos.persona.dismissed signals with payload definitions and best-effort caveat Overspecified fixed: - §7.2: "MUST NOT use intent-matching" was too broad (route 1 IS intent- matching); rewritten to scope confidence-gating prohibition to route 2 only - §6: remove MUST NOT rate-limit (too specific, no clear rationale) Too loose fixed: - §7.1: one-off query MAY claim even for unsupported persona_id changed to MUST NOT (footgun: downstream plugin that actually handles the id never fires) - §7.2: removed "minimum utterance length" from allowed gate-logic examples Structural: - One-off query moved from §5 (Summon) to §7.1 where it belongs - §7.1 + §7.2 merged; catch-all rule and gate-logic restriction now in one place - §7.2/7.3/7.4/7.5 renumbered to 7.2/7.3/7.4 - §2: remove implementation vocabulary from capabilities bullet - Conformance updated throughout Appendix: - Add appendix/persona-flow.md: annotated bus sequences for summon, active-persona turn, multi-turn, self-release dismiss, stop-cascade dismiss, and out-of-band query Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
session_id must not appear in message.data. The out-of-band query caller sets context.session.session_id for history scoping; the plugin reads from there. Added a clarifying sentence to that effect. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Trim / implementation leakage:
- §2: remove trailing paragraph that restates §1 "not define"
- §3: remove explanatory sentence about why propagation matters
- §4: remove tautological third bullet ("persona-related behaviour is absent")
- §8.1: collapse verbose "Zero emissions is conformant" into the MAY line
- §8.3: cut streaming token-by-token detail (covered by PIPELINE-1 §6.5);
add MUST listen:true on get_response prompts; simplify multi-turn step list
- §8.4: remove LLM-specific examples (embeddings, model state, transcripts);
require session field be registered per SESSION-1 §2.1 rather than naming it
- §9: remove internal "wiring, solver chain" comment from register payload
- §10: collapse numbered justification list into one prose sentence
Bug fixes:
- §6: fix "client omitting persona_id" being listed as a dismiss mechanism —
SESSION-1 §4 carries fields forward; only explicit clear counts; rewrite
paragraph to reflect this and remove the rate-limit MUST NOT (impl concern)
- §8.5: add response payload table; add MUST respond None for unknown persona_id
- §8.6: both conditions become MUST (was SHOULD+MUST)
- §9: MUST NOT serve same persona_id → SHOULD NOT (first match wins, not error)
- §11: add ovos.persona.activated / ovos.persona.dismissed advisory signals
- §12: move stop-awareness to separate MUST block; add listen:true to SHOULD;
fix persona_id uniqueness wording
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rmers Multi-persona coexistence (§9): - Reframe as the primary pluggable-capabilities mechanism - Add capability-based routing: routing skill/UI queries ovos.persona.list tags to select persona_id; plugin only declares, doesn't participate - Define persona-fallback pipeline_id: secondary pipeline position that claims utterances when persona_id is absent (route 3 catch-all) - Only one fallback stage SHOULD be active per pipeline Match contract (§7.1): - Add route 3: fallback_pipeline_id match rules — claim when persona_id absent or supported; return None when another persona's id is active Discovery (§8.7): - ovos.persona.list.response now carries per-persona objects with persona_id, name (optional), tags (optional freeform string array) - Response also carries fallback_pipeline_id when registered - Tags are advisory, vocabulary is deployment-defined Pipeline positioning (§10): - Distinguish main pipeline_id position (active-persona) from fallback_pipeline_id position (persona-fallback catch-all) - Updated typical ordering example with both positions §2 (What is a persona): - Explicit "black box" statement — internal machinery is out of scope - Add dialog transformers note: personality shaping belongs in TRANSFORM-1, not in the persona plugin §3: - Explicit single-value statement: one persona_id per session §4 (No-persona mode): - Remove default-persona policy paragraph (deployment concern) - Reference persona-fallback as the mechanism that handles utterances in no-persona mode §1 / See also: - Add output transformation to "does not define" §11 (Bus surface): - Add fallback_pipeline_id dispatch row §12 (Conformance): - Add SHOULD include tags in list response - Add MAY register fallback_pipeline_id - Add deployment SHOULD rules for fallback positioning and designation Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…data ovos.persona.ask / ovos.persona.ask.response → ovos.persona.query / ovos.persona.answer. The verb pair query/answer is unambiguous, drops the .response suffix, and fits the established pattern for data-exchange topics per AGENTS.md §4.5. Also remove session_id from the ovos.persona.query request payload — session context is read from context.session.session_id, never data. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Companion issue: #50
Summary
Defines the persona pipeline plugin — a complete conversational agent that, when active for a session, claims every utterance that reaches its pipeline stage and generates natural-language responses.
What the spec covers
persona_idsession field: absent = no-persona mode (deterministic pipeline); present = named persona activeMatch.updated_session, or external via session field) and dismisssession.fallback_pipeline_idfor per-persona fallback chains; conversation history via SESSION-2 MAY-internal pathwayovos.persona.query/ovos.persona.answer— direct text-in/text-out bypassing the pipeline; session for history fromcontext.session.session_idpersona_ids; at most one active per sessionBus surface
ovos.persona.queryovos.persona.answerovos.persona.listovos.persona.list.responseovos.persona.registerovos.persona.deregister