Skip to content

feat: add a pipeline_id filter to End2EndTest#112

Merged
JarbasAl merged 1 commit into
devfrom
feat/pipeline-id-filter
Jul 2, 2026
Merged

feat: add a pipeline_id filter to End2EndTest#112
JarbasAl merged 1 commit into
devfrom
feat/pipeline-id-filter

Conversation

@JarbasAl

@JarbasAl JarbasAl commented Jul 2, 2026

Copy link
Copy Markdown
Member

The skill_id filter isolates one dispatch lifecycle from concurrent ones by
context skill_id. That breaks when two concurrent lifecycles share a
skill_id — notably a targeted stop (OVOS-STOP-1 §3.1) interrupting a running
skill: the stop dispatch carries the target's skill_id (so it can't be told
apart from the skill's own messages), but only the stop dispatch carries the
stop plugin's pipeline_id (OVOS-PIPELINE-1 §3.1, stamped on the dispatch
context).

Adds a pipeline_id filter alongside skill_id (applied the same way, and
composable). 2 new tests via a skill that emits two lifecycles sharing a
skill_id but differing in pipeline_id.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • End-to-end test runs can now be isolated by pipeline identifier as well as skill identifier.
    • Message capture now respects the selected pipeline, making it easier to focus on one execution flow when multiple run at once.
  • Bug Fixes

    • Routing checks are skipped when pipeline isolation is enabled, preventing unrelated assertions from failing during filtered test runs.
    • Added coverage for concurrent executions that share the same skill identifier but belong to different pipelines.

The skill_id filter isolates one dispatch lifecycle from concurrent ones by
context skill_id. That fails when two concurrent lifecycles share a skill_id —
notably a targeted stop (OVOS-STOP-1 §3.1) interrupting a running skill: the
stop dispatch carries the target's skill_id (so it can't be told apart from the
skill's own messages), but only the stop dispatch carries the stop plugin's
pipeline_id (OVOS-PIPELINE-1 §3.1, stamped on the dispatch context).

Add a `pipeline_id` filter alongside `skill_id`, applied the same way (and
composable with it). Tests: a skill that emits two lifecycles sharing a skill_id
but differing in pipeline_id, isolated each way.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: d510376a-f6a8-49c8-9f43-1da5e84a27c0

📥 Commits

Reviewing files that changed from the base of the PR and between 5377e96 and 35d8dfb.

📒 Files selected for processing (2)
  • ovoscope/__init__.py
  • test/unittests/test_end2end_extended.py

📝 Walkthrough

Walkthrough

Adds an optional pipeline_id field to End2EndTest for filtering captured messages by dispatch context, updates routing assertion gating to also check pipeline_id, and adds tests including a new skill emitting messages with shared skill_id but varying pipeline_id.

Changes

Pipeline ID Filtering

Layer / File(s) Summary
pipeline_id field and filtering logic
ovoscope/__init__.py
Adds pipeline_id field to End2EndTest, filters captured messages by context.pipeline_id in execute(), and gates routing assertions on both skill_id and pipeline_id being None.
Test skill and filter test cases
test/unittests/test_end2end_extended.py
Adds SharedSkillIdSkill emitting step/utterance-handled messages with shared skill_id but distinct pipeline_id values, and TestPipelineIdFilter verifying filtered results per pipeline.

Estimated code review effort: 2 (Simple) | ~12 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Test as TestPipelineIdFilter
  participant E2E as End2EndTest
  participant Msgs as CapturedMessages

  Test->>E2E: execute(pipeline_id="pipe.a")
  E2E->>Msgs: filter by skill_id (if set)
  E2E->>Msgs: filter by context.pipeline_id == "pipe.a"
  E2E->>E2E: skip routing assertions (skill_id/pipeline_id set)
  E2E-->>Test: filtered lifecycle messages
Loading

Possibly related PRs

  • OpenVoiceOS/ovoscope#110: Both PRs modify End2EndTest.execute() message filtering and assertion gating logic in ovoscope/__init__.py, one by skill_id and one by pipeline_id.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/pipeline-id-filter

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

Greetings! I've analyzed your changes and have some results to share. 🖖

I've aggregated the results of the automated checks for this PR below.

🔍 Lint

Another piece of the puzzle! 🧩

ruff: issues found — see job log

📋 Repo Health

Ensuring the codebase stays lean and mean. 💪

✅ All required files present.

Latest Version: 1.4.0a1

ovoscope/version.py — Version file
README.md — README
LICENSE — License file
pyproject.toml — pyproject.toml
⚠️ setup.py — setup.py
CHANGELOG.md — Changelog
ovoscope/version.py has valid version block markers

⚖️ License Check

Ensuring our licenses are consistent and clear. 📄

✅ No license violations found.

Policy: Apache 2.0 (universal donor). StrongCopyleft / NetworkCopyleft / WeakCopyleft / Other / Error categories fail. MPL allowed.

🔒 Security (pip-audit)

I've audited the packages. Safety first! 🦺

✅ No known vulnerabilities found (78 packages scanned).

🏷️ Release Preview

I've checked the countdown clock for the next release. ⏰

Current: 1.4.0a1Next: 1.5.0a1

Signal Value
Label (none)
PR title feat: add a pipeline_id filter to End2EndTest
Bump minor

✅ PR title follows conventional commit format.


🚀 Release Channel Compatibility

Predicted next version: 1.5.0a1

Channel Status Note Current Constraint
Stable Not in channel -
Testing Too new (must be <1.0.0) ovoscope>=0.7.2,<1.0.0
Alpha Compatible ovoscope>=1.4.0a1

🔨 Build Tests

Checking if the code is properly tempered. ⚔️

✅ All versions pass

Python Build Install Tests
3.10
3.11
3.12
3.13
3.14

📊 Coverage

Mapping the landscape of your tests. 🗺️

53.3% total coverage

Files below 80% coverage (17 files)
File Coverage Missing lines
ovoscope/simple_listener.py 0.0% 55
ovoscope/tts_intelligibility.py 0.0% 190
ovoscope/version.py 0.0% 5
ovoscope/intent_cases.py 14.0% 141
ovoscope/classic_listener.py 18.2% 117
ovoscope/pipeline.py 31.0% 78
ovoscope/ocp.py 31.8% 58
ovoscope/cli.py 32.8% 162
ovoscope/e2e.py 34.9% 99
ovoscope/pytest_plugin.py 41.4% 222
ovoscope/listener.py 56.2% 123
ovoscope/media.py 57.2% 101
ovoscope/voice_loop.py 58.3% 115
ovoscope/__init__.py 59.0% 317
ovoscope/coverage.py 63.3% 69
ovoscope/audio.py 64.2% 112
ovoscope/media_provider.py 64.9% 20

Full report: download the coverage-report artifact.


Final report submitted. Over and out. 📻

@JarbasAl JarbasAl marked this pull request as ready for review July 2, 2026 19:00
@JarbasAl JarbasAl merged commit 9201c56 into dev Jul 2, 2026
14 checks passed
@JarbasAl JarbasAl deleted the feat/pipeline-id-filter branch July 2, 2026 19:00
@github-actions github-actions Bot added feature and removed feature labels Jul 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant