Skip to main content

ovos-routing-judge

Who took an utterance, and was it the skill that should have?

One judge for every tool that replays golden utterances (test/end2end/golden_utterances_<lang>.jsonl) against OpenVoiceOS and asks whether each sentence reached the right skill. It is pure Python over the bus messages of one session: no messagebus connection, no UI, no store knowledge, no dependencies. So the same row gets the same verdict wherever it runs:

A failure in CI can then be reproduced on a device and judged the same way (andlo/ovos-klondike-mercantile#48).

Use

from ovos_routing_judge import Claim, in_session, judge

claim = Claim.from_messages(recorded, known_ids=loaded_skill_ids,   # Message objects or dicts
                            session_id=row_session_id)
v = judge(claim, own_ids={"ovos-skill-date-time.openvoiceos"},
          expected="ovos-skill-date-time.openvoiceos:what_time_is_it",
          hung=timed_out, known_ids=loaded_skill_ids)
v.kind     # hit | wrong_intent | captured | other | unhandled | hang
v.taker    # who took it
v.via      # its best signal: intent | provider | ocp | skill | speak
v.detail   # one line on what happened

Claim.observe(message, known_ids) folds messages in one at a time, for a live run that wants to know as soon as something matched.

Verdicts

kind meaning
hit the row's skill took it (with the expected intent, when the row names one)
wrong_intent the row's skill took it with another intent
captured the row's skill was waiting for an answer (get_response / converse) and took the sentence as that answer
other another skill took it (taker); a store can split this further
unhandled nobody took it, or only a pipeline stage with no skill behind it
hang nobody took it and the caller timed out

What counts as taking a sentence

Signals come in tiers; the taker is the first known skill in the best tier:

  1. intent: <skill_id>:<intent> dispatched, ovos.intent.matched, or a pending <skill_id>.converse.* capturing it
  2. provider: a pipeline plugin asked it for content (ovos.common_reading.fetch_content.<skill_id>)
  3. ocp: OCP picked its result (ovos.common_play.play media, or the first track of play / search.populate without a player)
  4. skill: handler start, a fallback that answered, common query's question:action
  5. speak: it spoke in this session (speak or core 3's ovos.utterance.speak)

ovos.intent.unmatched means nobody, whatever else was seen.

With session_id, other sessions' messages are ignored, and a message without a session can show an intent, a provider or an OCP pick but never a tier 4 or 5 claim: unrelated skills' background activity (a scheduled event's handler, a fallback probe's reply) arrives without a session and is not theft (learned in ovos-test-harness's fleet suite).

Intent names are compared in one spelling: Name.intent (ovos-workshop 1.x) vs Name, CamelCase in older releases vs snake_case, padatious what.time.is.it vs padacioso what_time_is_it. A row with "intent_type": "ocp" must go through OCP.

The contract

tests/fixtures/cases.json holds recorded message sequences and the verdict each must get. When a core changes its signals, a case goes in there and every tool using the package gets the fix.

License

Apache-2.0

Metadata

Release files for ovos-routing-judge 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ovos-routing-judge 0.0.1
File Size Uploaded
ovos_routing_judge-0.0.1.tar.gz 15.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ovos-routing-judge 0.0.1
File Interpreter ABI Platform
ovos_routing_judge-0.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 29.8 kB

Release files / ovos_routing_judge-0.0.1.tar.gz

Download URL ovos_routing_judge-0.0.1.tar.gz
Size 15.2 kB
Tags Source
SHA-256 checksum
How to use checksums
5bb4285103dad731a5556da4ce11ae25e10d809f444434acb9815753430b9123
BLAKE2b-256 checksum
How to use checksums
29392415cf144157a106ee3a9af3f046c7abfed79490769a209dba09b4c9cad3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / ovos_routing_judge-0.0.1-py3-none-any.whl

Download URL ovos_routing_judge-0.0.1-py3-none-any.whl
Size 14.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7f7d08ec2c038fef3bb030766716aa3339ab4add42ab27d4d941cd552caf4027
BLAKE2b-256 checksum
How to use checksums
0dca3fc3dde1fbce8122266970f58c7a4f1fb08163e983633706b359afddc25b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release history Release notifications | RSS feed

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

This release

0.0.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page