[GH-ISSUE #6785] [Bug] Signal decoder catalog search matches across the ID/name boundary #4136

Closed
opened 2026-10-31 00:47:04 +00:00 by bsakaguchi · 0 comments
Owner

Originally created by @coygeek on GitHub (Oct 23, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/6785

Before submitting

  • I searched the open and closed issues for a related report.
  • I removed credentials, tokens, private paths, and sensitive target data.

Area

Provider or capability discovery

Observed behavior

The production decoder-discovery parser returns UART for the literal query uart U, although that text occurs in neither its ID uart nor its name Universal Asynchronous Receiver/Transmitter. It reports matching: 1. The query art Uni produces the same false match.

This was executed against the compiled production parser with synthetic catalog text. No real sigrok process, CLI request, or MCP request was run for this report.

Reproduction

From the repository root at the revision below, after the normal locked dependency installation and runtime build, run with Node 24.22.1:

node --input-type=module <<'NODE'
import { parseDecoderDiscovery } from './dist/signals/parseDecoderDiscovery.js';
import { inspectSignalDecodersInputSchema } from './dist/domain/signals/signalDecoders.js';
const id = 'uart';
const name = 'Universal Asynchronous Receiver/Transmitter';
const catalog = `Supported protocol decoders:\n  ${id}  ${name}\n`;
for (const query of ['uart', 'Universal', 'uart U', 'art Uni', 'uart nope']) {
  const result = parseDecoderDiscovery(catalog, inspectSignalDecodersInputSchema.parse({ query }));
  console.log(JSON.stringify({
    query,
    occursInID: id.toLowerCase().includes(query.toLowerCase()),
    occursInName: name.toLowerCase().includes(query.toLowerCase()),
    matching: result.output_window.matching,
    decoders: result.decoders,
  }));
}
NODE

One local run covered both false matches and the three controls. The fixture is fully embedded above and does not need an external recording.

Expected behavior

A literal query should match within an individual decoder ID or name. Both uart U and art Uni should yield no records and matching: 0.

The input contract describes a “literal substring in decoder ID/name or help lines.” The guide also documents literal substring search.

Impact and scope

Catalog queries spanning the artificial ID/name separator return records whose individual fields do not contain the query, and their matching count includes those records. The demonstrated case uses the ordinary UART ID and display name, with a synthetic catalog envelope.

This is a bounded filtering defect. Queries wholly inside an ID or name worked in the same run and offer a practical workaround; callers can also inspect returned ID/name values. Native installation behavior, public CLI/MCP projection, other catalog contents, and frequency in user workflows were not tested.

REA version

rea-agents 6.7.0; source revision 98ca6c82705bf8c44f814620636852f938d827ca.

Runtime and platform

Node.js v24.22.1; Linux 7.2.8-9-omarchy; x86_64. Native sigrok was not used.

Target and artifact context

Synthetic, one-record sigrok decoder catalog text; no target execution, hardware acquisition, or recording access.

Interface

Other

Earliest failure stage

Transport or result projection

Relevant output or evidence

Relevant fields from the executed parser result:

{"query":"uart U","occursInID":false,"occursInName":false,"matching":1,"decoders":[{"id":"uart","name":"Universal Asynchronous Receiver/Transmitter"}]}
{"query":"art Uni","occursInID":false,"occursInName":false,"matching":1,"decoders":[{"id":"uart","name":"Universal Asynchronous Receiver/Transmitter"}]}

The uart and Universal controls returned one match; uart nope returned none. These observations establish parser behavior for the shown text, rather than native sigrok behavior.

Typed outcome or recovery expected

A successful empty catalog page with matching: 0, returned: 0, and decoders: [] for either demonstrated cross-field query.

Analysis or suspected cause

Source-derived cause: parseDecoderDiscovery.ts lines 49–54 joins ID and name with a space before applying includes. That introduces substrings absent from both source fields. Help mode filters each original help line separately.

Additional context

Related #6714 concerns missing Greek-sigma matches caused by case conversion. This report uses ASCII and concerns false matches created by joining separate fields. Open and closed issue searches found no matching report for this behavior. No last-known-good revision was established.

Triage assessment

  • Impact level: P2
  • Assessment status: supported
  • Impact basis: The executed production parser returns a decoder and a positive matching count for two literal queries absent from both searchable fields; scope is catalog filtering on the demonstrated synthetic input.
  • Workaround status: available
  • Workaround basis: Queries wholly inside the ID or name returned correct matches in the same run; callers can use those queries and inspect the returned fields.
Originally created by @coygeek on GitHub (Oct 23, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/6785 ## Before submitting - [x] I searched the open and closed issues for a related report. - [x] I removed credentials, tokens, private paths, and sensitive target data. ## Area Provider or capability discovery ## Observed behavior The production decoder-discovery parser returns UART for the literal query `uart U`, although that text occurs in neither its ID `uart` nor its name `Universal Asynchronous Receiver/Transmitter`. It reports `matching: 1`. The query `art Uni` produces the same false match. This was executed against the compiled production parser with synthetic catalog text. No real sigrok process, CLI request, or MCP request was run for this report. ## Reproduction From the repository root at the revision below, after the normal locked dependency installation and runtime build, run with Node 24.22.1: ```sh node --input-type=module <<'NODE' import { parseDecoderDiscovery } from './dist/signals/parseDecoderDiscovery.js'; import { inspectSignalDecodersInputSchema } from './dist/domain/signals/signalDecoders.js'; const id = 'uart'; const name = 'Universal Asynchronous Receiver/Transmitter'; const catalog = `Supported protocol decoders:\n ${id} ${name}\n`; for (const query of ['uart', 'Universal', 'uart U', 'art Uni', 'uart nope']) { const result = parseDecoderDiscovery(catalog, inspectSignalDecodersInputSchema.parse({ query })); console.log(JSON.stringify({ query, occursInID: id.toLowerCase().includes(query.toLowerCase()), occursInName: name.toLowerCase().includes(query.toLowerCase()), matching: result.output_window.matching, decoders: result.decoders, })); } NODE ``` One local run covered both false matches and the three controls. The fixture is fully embedded above and does not need an external recording. ## Expected behavior A literal query should match within an individual decoder ID or name. Both `uart U` and `art Uni` should yield no records and `matching: 0`. The [input contract](https://github.com/morluto/rea/blob/98ca6c82705bf8c44f814620636852f938d827ca/src/domain/signals/signalDecoders.ts#L14-L20) describes a “literal substring in decoder ID/name or help lines.” The [guide](https://github.com/morluto/rea/blob/98ca6c82705bf8c44f814620636852f938d827ca/docs/signal-recordings.md#L137-L144) also documents literal substring search. ## Impact and scope Catalog queries spanning the artificial ID/name separator return records whose individual fields do not contain the query, and their matching count includes those records. The demonstrated case uses the ordinary UART ID and display name, with a synthetic catalog envelope. This is a bounded filtering defect. Queries wholly inside an ID or name worked in the same run and offer a practical workaround; callers can also inspect returned ID/name values. Native installation behavior, public CLI/MCP projection, other catalog contents, and frequency in user workflows were not tested. ## REA version `rea-agents` 6.7.0; source revision `98ca6c82705bf8c44f814620636852f938d827ca`. ## Runtime and platform Node.js `v24.22.1`; Linux `7.2.8-9-omarchy`; x86_64. Native sigrok was not used. ## Target and artifact context Synthetic, one-record sigrok decoder catalog text; no target execution, hardware acquisition, or recording access. ## Interface Other ## Earliest failure stage Transport or result projection ## Relevant output or evidence Relevant fields from the executed parser result: ```json {"query":"uart U","occursInID":false,"occursInName":false,"matching":1,"decoders":[{"id":"uart","name":"Universal Asynchronous Receiver/Transmitter"}]} {"query":"art Uni","occursInID":false,"occursInName":false,"matching":1,"decoders":[{"id":"uart","name":"Universal Asynchronous Receiver/Transmitter"}]} ``` The `uart` and `Universal` controls returned one match; `uart nope` returned none. These observations establish parser behavior for the shown text, rather than native sigrok behavior. ## Typed outcome or recovery expected A successful empty catalog page with `matching: 0`, `returned: 0`, and `decoders: []` for either demonstrated cross-field query. ## Analysis or suspected cause Source-derived cause: [parseDecoderDiscovery.ts lines 49–54](https://github.com/morluto/rea/blob/98ca6c82705bf8c44f814620636852f938d827ca/src/signals/parseDecoderDiscovery.ts#L49-L54) joins ID and name with a space before applying `includes`. That introduces substrings absent from both source fields. Help mode filters each original help line separately. ## Additional context Related [#6714](https://github.com/morluto/rea/issues/6714) concerns missing Greek-sigma matches caused by case conversion. This report uses ASCII and concerns false matches created by joining separate fields. Open and closed issue searches found no matching report for this behavior. No last-known-good revision was established. ## Triage assessment - Impact level: P2 - Assessment status: supported - Impact basis: The executed production parser returns a decoder and a positive matching count for two literal queries absent from both searchable fields; scope is catalog filtering on the demonstrated synthetic input. - Workaround status: available - Workaround basis: Queries wholly inside the ID or name returned correct matches in the same run; callers can use those queries and inspect the returned fields.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
morluto/rea#4136
No description provided.