Files
logos-protocol/cpp
Dario Gabriel LipicarandClaude Opus 5 d5a370dbaf Merge master, and make the async contract state its own boundaries
#40 merged, so this is retargeted from its branch to master. One conflict, in
tests/protocol/CMakeLists.txt: pure add/add, #40's test_lp_invoke_async_error
and this branch's two files all kept. 270/270.

Also amends the lp_invoke_async contract text that #40 landed. It said `cb`
carries "the same outcome the sync twin splits across its return code and
out-params", illustrated with "object_unavailable when the target module is
not loaded". That is a statement about PARITY, and it reads as one about
COVERAGE -- and the illustration was the case #40 did not fix: on the plain
transport requestObject never checks publication, so an unloaded module behind
a live host is a MODULE_NOT_LOADED result at call time, not an acquire
failure. #40's object_unavailable fired only when the whole endpoint was down.

This branch makes the example true, so the text can now be precise rather than
aspirational. It states what ok == 0 covers -- acquire failure, deadline
exceeded, rejected token, MODULE_NOT_LOADED from a live host, on BOTH twins --
and what it does not:

  * an unknown method name, because every provider answers one with a bare
    null, byte-identical to a method that legitimately returns null. The
    distinction does not exist on the wire to be reported; closing it needs a
    provider-contract change across the SDKs.
  * a provider's rejection of well-formed arguments (dispatch_failed), which
    arrives as a result and is folded by the generated wrappers, in neither
    twin -- deliberately, and symmetrically.

An ABI doc that overstates coverage is worse than one that admits a gap: it is
what a port is written against.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 17:56:12 -03:00
..