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 |
|
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
KeyboardInterruptblock 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.