Repository navigation
v1.7.4
1.7.4 — 2026-09-25: the "no calls recorded" refusal reads the record before it gives advice
Changes recorded output, which is why it is its own release: the text of one
refusal. What is refused, and when, is unchanged. The exit code is still 2, and the
message still starts no calls recorded for task ….
Changed
- The refusal for a task with no call on its record now says what the record
holds, and names a cause only when the disk supports it. It used to say the record
"is empty or missing" and point at the config'senvblock whatever was on disk.
In Gate BD's 2026-09-24 replication it refused on a chaos record holding a
notifications/initializedrow. The proxy wrote that row, so the record path had
demonstrably arrived. The message still called the file empty and blamed the env
block.RecordWritercreates a record on its first row and the scan never creates
one, so the record itself can prove the path arrived. One helper,
explain_unrecordedinratemyagent/proxy.py, now serves both refusal sites (the
clean pass and the fault pass):- missing:
there is no record at …. The env block is advised, unless
another pass's record for the same task holds rows, in which case the same config
template carried the path and the env block is ruled out. - rows, none a call:
holds no tool calls -- 1 row(s): notifications/initialized --. The proxy wrote them, so this is not the env block. The agent connected and
made no tool call. No env-block advice. - present, no readable row: zero bytes leaves the env block as one candidate
among several, and says so. Bytes without a readable row mean a proxy with the
path was cut off mid-write. Another pass's rows rule the env block out in either
case. - Every branch states the rows found and never says "empty or missing". When the
scan holds the agent'sResponse, the message carries the agent's own account:
The agent exited 1 and reported failure: …, or that it was killed at the
deadline.
- missing:
- The agent target's no-result-line
Responsenow carriesexit_codeinmeta, as the
claimed path already did, so the refusal can report how the agent ended.
Added
tests/test_unrecorded_refusal.py: every branch, asserted on the text the user reads,
including the replication's case end to end through the CLI and the clean-pass site
through the probe. The predicate that detects env-block advice is shown to fire on
the 1.7.3 message verbatim, so the suppression assertions cannot pass vacuously. A
mutation that restores the env advice in the rows-no-calls branch fails three of
them.tests/fixtures/agents/quitter_agent.py: connects, makes no tool call, and reports
failure in a chosen pass. It is the replication's replicate 2 as a fixture.
Verified
- Full suite on both SDK majors: 1597 passed, 7 skipped on mcp 2.1.1 and on mcp 1.30.0;
1604 collected (1592 + 12 new tests, none removed). ruffclean;twine checkPASSED for both artifacts. Wheel +2,390 bytes, sdist +6,259.- Five mock profiles and the three README agent demos unchanged from 1.7.3.