Limitations

What the receptor does not do, and why. Kept in one place so nothing is a surprise discovered in the middle of a debugging session.

Not implemented

Gap

Detail

Worker identity in text

You are told a group has 38 occurrences and which tests they are, but not which worker ran each. The JSONL phase event retains the worker ID. See below — omission from text is a decision, not a backlog item.

Warning baselines

Warnings are grouped, but there is no accepted-baseline comparison, so you cannot yet ask “what is new since last week”.

Artifact retention and large records

JSONL is opt-in, streamed, and has an auditable hard total-size ceiling (50 MiB by default). Captured sections remain inline, so one oversized event can be omitted when it reaches that ceiling. External blobs and cleanup/retention remain deployment responsibilities.

Cause chains beyond one link

raise X from Y reports Y. A longer chain reports only the first cause.

Semantic truncation budgets

Long messages are cut at a fixed length with the omission stated, rather than at a structural boundary.

Deliberately not done

Worker identity under xdist

The signal it would provide — a group of failures landing entirely on one worker — is confounded by the distribution mode. Under --dist loadfile or loadscope, failures from one file land on one worker by construction, so “all on gw3” would be an artifact of scheduling rather than a finding about your code.

The bare identifier without execution order also does not help you reproduce anything. If you suspect worker-local state, -n0 is the check.

A periodic heartbeat

The progress line fires when a test finishes, so a genuinely stuck test produces no further output. It is a liveness signal, not a hang detector, and it says so.

Its predecessor claimed to be a periodic heartbeat and was not — it could only fire between tests either — so it was removed rather than fixed. What survives a kill is the last line printed, which tells you how far the run got.

CI annotation syntax

::error file=... would make failures appear inline on a GitHub pull request. It is vendor syntax with no demonstrated demand yet, and the ci profile is the one that can least afford extra lines. Waiting on a project that wants it.

Bounded, not absolute

Credential redaction

Values that look like credentials are redacted before anything is rendered or written:

ValueError: connect failed: api_key=[REDACTED] rejected

Warning

This is a conservative net, not a security boundary. It matches keyword-anchored shapes — api_key=, token:, Bearer ... — above a minimum length. It cannot catch a secret that does not look like one. Do not rely on it to make a log safe to publish.

The on-disk text report and JSONL artifact are created owner-only and refuse to follow a symlink, which bounds who can read them rather than what goes into them.

Untrusted test output

ANSI escapes and control characters are stripped, and no text produced by a test can forge a verdict line. Escaping protects structure; it does not make test-produced text trustworthy. The receptor never presents captured output as an instruction and never suggests a command that mutates your environment.

Known rough edges

  • Under xdist, one blank line from xdist itself precedes the report. It is written outside pytest’s terminal writer, and removing it would mean reaching further into another plugin than a cosmetic gain justifies.

  • Interrupting a run with Ctrl-C leaves pytest’s own KeyboardInterrupt block after the receptor’s verdict. Suppressing it has no public mechanism.

Untested combinations

Covered by CI: Python 3.11–3.13, pytest 8 and 9, serial and distributed, pytest-cov, pytest-rerunfailures, pytest-subtests, and JUnit XML.

Everything else in your plugin stack is unknown territory. If a plugin you rely on goes quiet under --receptor=llm, that is a defect on our side — silencing pytest once swallowed pytest-cov’s report by accident, and the same mistake could be hiding elsewhere.