Files
mxaccess/design/public-api/mxaccess-callback.txt
T
Joseph Doherty 9e57bfd451 [F41 + F44 reconciliation] cargo public-api baselines + multi-record DataUpdate codec
**F41 — public-api baselines (M6 DoD bullet 5)**

`design/public-api/{crate}.txt` for all 9 workspace crates, generated
via `cargo +nightly public-api --simplified -p <crate>`. Per-crate
baseline sizes:
- mxaccess-codec: 2516 lines
- mxaccess-asb:   1258 lines
- mxaccess-rpc:   1273 lines
- mxaccess-asb-nettcp: 708 lines
- mxaccess: 542 lines
- mxaccess-galaxy: 374 lines
- mxaccess-callback: 170 lines
- mxaccess-compat: 123 lines
- mxaccess-nmx: 118 lines

`design/public-api/README.md` documents the update procedure
(install nightly + cargo-public-api, regenerate the affected baseline
on intentional API changes, commit alongside).

`.github/workflows/rust.yml` gains a `public-api` job that runs the
same diff against the committed baseline; drift fails CI with a
unified diff in the log so the PR author can either revert or
update the baseline.

**F44 reconciliation — multi-record DataUpdate codec**

Cherry-picked from the F44 sub-agent's worktree (commit `aec6a0c`):
`subscription_message.rs::parse_data_update` now loops over
`record_count` like `parse_subscription_status` does, accepting any
positive count. The .NET reference still hard-throws on
`record_count != 1`; the Rust codec deliberately diverges per the F44
evidence walk against `captures/094-frida-buffered-separate-writer/
frida-events.tsv:145` (a `0x33` DataUpdate body with `record_count = 2`,
inner_length = 23 (preamble) + 2 * 19 (records) = 61, post a
separate-session writer triggering two value changes inside one
`SetBufferedUpdateInterval(1000)` window).

Two new round-trip tests:
- `data_update_multi_record_round_trip` — synthesises a 2-record body,
  parses, asserts both records decode to expected Int32 values.
- `data_update_capture_094_truncated_record_errors` — truncates the
  capture-094 fixture mid-second-record, asserts CodecError::Decode.

New wire-byte fixtures under `crates/mxaccess-codec/tests/fixtures/m6-buffered/`:
- `094-line145-dataupdate-recordcount2.bin` (57 bytes, `0x33` multi-record)
- `094-line48-substatus-recordcount2.bin` (101 bytes, `0x32` multi-record)

R2 in `design/70-risks-and-open-questions.md` updated from
"single-sample (settled silently)" to "settled per option (a) — codec
relaxed; multi-record observed in production-stack tracing."

`design/followups.md`: F44's verdict updated to reflect the
contradiction-then-relaxation, with reference to the new tests +
fixtures.

Workspace 792 → 794 tests pass; clippy clean; rustdoc clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 05:27:11 -04:00

171 lines
14 KiB
Plaintext

pub mod mxaccess_callback
pub mod mxaccess_callback::exporter
pub enum mxaccess_callback::exporter::CallbackEvent
pub mxaccess_callback::exporter::CallbackEvent::AcceptError
pub mxaccess_callback::exporter::CallbackEvent::AcceptError::reason: alloc::string::String
pub mxaccess_callback::exporter::CallbackEvent::Auth3Ignored
pub mxaccess_callback::exporter::CallbackEvent::Bind
pub mxaccess_callback::exporter::CallbackEvent::Bind::context_id: u16
pub mxaccess_callback::exporter::CallbackEvent::Bind::iid: mxaccess_rpc::guid::Guid
pub mxaccess_callback::exporter::CallbackEvent::CallbackInvoked
pub mxaccess_callback::exporter::CallbackEvent::CallbackInvoked::body: alloc::vec::Vec<u8>
pub mxaccess_callback::exporter::CallbackEvent::CallbackInvoked::opnum: u16
pub mxaccess_callback::exporter::CallbackEvent::ClientConnected
pub mxaccess_callback::exporter::CallbackEvent::ClientConnected::remote: core::net::socket_addr::SocketAddr
pub mxaccess_callback::exporter::CallbackEvent::ClientDisconnected
pub mxaccess_callback::exporter::CallbackEvent::ProtocolError
pub mxaccess_callback::exporter::CallbackEvent::ProtocolError::reason: alloc::string::String
pub mxaccess_callback::exporter::CallbackEvent::RemQueryInterface
pub mxaccess_callback::exporter::CallbackEvent::RemQueryInterface::hresult: i32
pub mxaccess_callback::exporter::CallbackEvent::RemQueryInterface::requested_iid: mxaccess_rpc::guid::Guid
pub mxaccess_callback::exporter::CallbackEvent::Request
pub mxaccess_callback::exporter::CallbackEvent::Request::context_id: u16
pub mxaccess_callback::exporter::CallbackEvent::Request::iid: mxaccess_rpc::guid::Guid
pub mxaccess_callback::exporter::CallbackEvent::Request::opnum: u16
pub mxaccess_callback::exporter::CallbackEvent::Request::stub_len: usize
pub mxaccess_callback::exporter::CallbackEvent::UnhandledRequest
pub mxaccess_callback::exporter::CallbackEvent::UnhandledRequest::iid: mxaccess_rpc::guid::Guid
pub mxaccess_callback::exporter::CallbackEvent::UnhandledRequest::opnum: u16
impl core::clone::Clone for mxaccess_callback::exporter::CallbackEvent
pub fn mxaccess_callback::exporter::CallbackEvent::clone(&self) -> mxaccess_callback::exporter::CallbackEvent
impl core::cmp::Eq for mxaccess_callback::exporter::CallbackEvent
impl core::cmp::PartialEq for mxaccess_callback::exporter::CallbackEvent
pub fn mxaccess_callback::exporter::CallbackEvent::eq(&self, other: &mxaccess_callback::exporter::CallbackEvent) -> bool
impl core::fmt::Debug for mxaccess_callback::exporter::CallbackEvent
pub fn mxaccess_callback::exporter::CallbackEvent::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
impl core::marker::StructuralPartialEq for mxaccess_callback::exporter::CallbackEvent
impl core::marker::Freeze for mxaccess_callback::exporter::CallbackEvent
impl core::marker::Send for mxaccess_callback::exporter::CallbackEvent
impl core::marker::Sync for mxaccess_callback::exporter::CallbackEvent
impl core::marker::Unpin for mxaccess_callback::exporter::CallbackEvent
impl core::marker::UnsafeUnpin for mxaccess_callback::exporter::CallbackEvent
impl core::panic::unwind_safe::RefUnwindSafe for mxaccess_callback::exporter::CallbackEvent
impl core::panic::unwind_safe::UnwindSafe for mxaccess_callback::exporter::CallbackEvent
pub struct mxaccess_callback::exporter::CallbackExporter
impl mxaccess_callback::exporter::CallbackExporter
pub async fn mxaccess_callback::exporter::CallbackExporter::bind(addr: core::net::socket_addr::SocketAddr, identities: mxaccess_callback::exporter::ExporterIdentities) -> std::io::error::Result<(Self, tokio::sync::mpsc::unbounded::UnboundedReceiver<mxaccess_callback::exporter::CallbackEvent>)>
pub fn mxaccess_callback::exporter::CallbackExporter::create_callback_objref(&self, hostname: &str) -> alloc::vec::Vec<u8>
pub fn mxaccess_callback::exporter::CallbackExporter::identities(&self) -> mxaccess_callback::exporter::ExporterIdentities
pub fn mxaccess_callback::exporter::CallbackExporter::local_addr(&self) -> core::net::socket_addr::SocketAddr
pub async fn mxaccess_callback::exporter::CallbackExporter::shutdown(self)
impl core::ops::drop::Drop for mxaccess_callback::exporter::CallbackExporter
pub fn mxaccess_callback::exporter::CallbackExporter::drop(&mut self)
impl core::marker::Freeze for mxaccess_callback::exporter::CallbackExporter
impl core::marker::Send for mxaccess_callback::exporter::CallbackExporter
impl core::marker::Sync for mxaccess_callback::exporter::CallbackExporter
impl core::marker::Unpin for mxaccess_callback::exporter::CallbackExporter
impl core::marker::UnsafeUnpin for mxaccess_callback::exporter::CallbackExporter
impl !core::panic::unwind_safe::RefUnwindSafe for mxaccess_callback::exporter::CallbackExporter
impl !core::panic::unwind_safe::UnwindSafe for mxaccess_callback::exporter::CallbackExporter
pub struct mxaccess_callback::exporter::ExporterIdentities
pub mxaccess_callback::exporter::ExporterIdentities::callback_ipid: mxaccess_rpc::guid::Guid
pub mxaccess_callback::exporter::ExporterIdentities::oid: u64
pub mxaccess_callback::exporter::ExporterIdentities::oxid: u64
pub mxaccess_callback::exporter::ExporterIdentities::rem_unknown_ipid: mxaccess_rpc::guid::Guid
impl mxaccess_callback::exporter::ExporterIdentities
pub const fn mxaccess_callback::exporter::ExporterIdentities::fixed(oxid: u64, oid: u64, callback_ipid: mxaccess_rpc::guid::Guid, rem_unknown_ipid: mxaccess_rpc::guid::Guid) -> Self
pub fn mxaccess_callback::exporter::ExporterIdentities::random() -> Self
impl core::clone::Clone for mxaccess_callback::exporter::ExporterIdentities
pub fn mxaccess_callback::exporter::ExporterIdentities::clone(&self) -> mxaccess_callback::exporter::ExporterIdentities
impl core::cmp::Eq for mxaccess_callback::exporter::ExporterIdentities
impl core::cmp::PartialEq for mxaccess_callback::exporter::ExporterIdentities
pub fn mxaccess_callback::exporter::ExporterIdentities::eq(&self, other: &mxaccess_callback::exporter::ExporterIdentities) -> bool
impl core::fmt::Debug for mxaccess_callback::exporter::ExporterIdentities
pub fn mxaccess_callback::exporter::ExporterIdentities::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
impl core::hash::Hash for mxaccess_callback::exporter::ExporterIdentities
pub fn mxaccess_callback::exporter::ExporterIdentities::hash<__H: core::hash::Hasher>(&self, state: &mut __H)
impl core::marker::Copy for mxaccess_callback::exporter::ExporterIdentities
impl core::marker::StructuralPartialEq for mxaccess_callback::exporter::ExporterIdentities
impl core::marker::Freeze for mxaccess_callback::exporter::ExporterIdentities
impl core::marker::Send for mxaccess_callback::exporter::ExporterIdentities
impl core::marker::Sync for mxaccess_callback::exporter::ExporterIdentities
impl core::marker::Unpin for mxaccess_callback::exporter::ExporterIdentities
impl core::marker::UnsafeUnpin for mxaccess_callback::exporter::ExporterIdentities
impl core::panic::unwind_safe::RefUnwindSafe for mxaccess_callback::exporter::ExporterIdentities
impl core::panic::unwind_safe::UnwindSafe for mxaccess_callback::exporter::ExporterIdentities
pub const mxaccess_callback::exporter::IUNKNOWN_IID: mxaccess_rpc::guid::Guid
pub enum mxaccess_callback::CallbackEvent
pub mxaccess_callback::CallbackEvent::AcceptError
pub mxaccess_callback::CallbackEvent::AcceptError::reason: alloc::string::String
pub mxaccess_callback::CallbackEvent::Auth3Ignored
pub mxaccess_callback::CallbackEvent::Bind
pub mxaccess_callback::CallbackEvent::Bind::context_id: u16
pub mxaccess_callback::CallbackEvent::Bind::iid: mxaccess_rpc::guid::Guid
pub mxaccess_callback::CallbackEvent::CallbackInvoked
pub mxaccess_callback::CallbackEvent::CallbackInvoked::body: alloc::vec::Vec<u8>
pub mxaccess_callback::CallbackEvent::CallbackInvoked::opnum: u16
pub mxaccess_callback::CallbackEvent::ClientConnected
pub mxaccess_callback::CallbackEvent::ClientConnected::remote: core::net::socket_addr::SocketAddr
pub mxaccess_callback::CallbackEvent::ClientDisconnected
pub mxaccess_callback::CallbackEvent::ProtocolError
pub mxaccess_callback::CallbackEvent::ProtocolError::reason: alloc::string::String
pub mxaccess_callback::CallbackEvent::RemQueryInterface
pub mxaccess_callback::CallbackEvent::RemQueryInterface::hresult: i32
pub mxaccess_callback::CallbackEvent::RemQueryInterface::requested_iid: mxaccess_rpc::guid::Guid
pub mxaccess_callback::CallbackEvent::Request
pub mxaccess_callback::CallbackEvent::Request::context_id: u16
pub mxaccess_callback::CallbackEvent::Request::iid: mxaccess_rpc::guid::Guid
pub mxaccess_callback::CallbackEvent::Request::opnum: u16
pub mxaccess_callback::CallbackEvent::Request::stub_len: usize
pub mxaccess_callback::CallbackEvent::UnhandledRequest
pub mxaccess_callback::CallbackEvent::UnhandledRequest::iid: mxaccess_rpc::guid::Guid
pub mxaccess_callback::CallbackEvent::UnhandledRequest::opnum: u16
impl core::clone::Clone for mxaccess_callback::exporter::CallbackEvent
pub fn mxaccess_callback::exporter::CallbackEvent::clone(&self) -> mxaccess_callback::exporter::CallbackEvent
impl core::cmp::Eq for mxaccess_callback::exporter::CallbackEvent
impl core::cmp::PartialEq for mxaccess_callback::exporter::CallbackEvent
pub fn mxaccess_callback::exporter::CallbackEvent::eq(&self, other: &mxaccess_callback::exporter::CallbackEvent) -> bool
impl core::fmt::Debug for mxaccess_callback::exporter::CallbackEvent
pub fn mxaccess_callback::exporter::CallbackEvent::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
impl core::marker::StructuralPartialEq for mxaccess_callback::exporter::CallbackEvent
impl core::marker::Freeze for mxaccess_callback::exporter::CallbackEvent
impl core::marker::Send for mxaccess_callback::exporter::CallbackEvent
impl core::marker::Sync for mxaccess_callback::exporter::CallbackEvent
impl core::marker::Unpin for mxaccess_callback::exporter::CallbackEvent
impl core::marker::UnsafeUnpin for mxaccess_callback::exporter::CallbackEvent
impl core::panic::unwind_safe::RefUnwindSafe for mxaccess_callback::exporter::CallbackEvent
impl core::panic::unwind_safe::UnwindSafe for mxaccess_callback::exporter::CallbackEvent
pub struct mxaccess_callback::CallbackExporter
impl mxaccess_callback::exporter::CallbackExporter
pub async fn mxaccess_callback::exporter::CallbackExporter::bind(addr: core::net::socket_addr::SocketAddr, identities: mxaccess_callback::exporter::ExporterIdentities) -> std::io::error::Result<(Self, tokio::sync::mpsc::unbounded::UnboundedReceiver<mxaccess_callback::exporter::CallbackEvent>)>
pub fn mxaccess_callback::exporter::CallbackExporter::create_callback_objref(&self, hostname: &str) -> alloc::vec::Vec<u8>
pub fn mxaccess_callback::exporter::CallbackExporter::identities(&self) -> mxaccess_callback::exporter::ExporterIdentities
pub fn mxaccess_callback::exporter::CallbackExporter::local_addr(&self) -> core::net::socket_addr::SocketAddr
pub async fn mxaccess_callback::exporter::CallbackExporter::shutdown(self)
impl core::ops::drop::Drop for mxaccess_callback::exporter::CallbackExporter
pub fn mxaccess_callback::exporter::CallbackExporter::drop(&mut self)
impl core::marker::Freeze for mxaccess_callback::exporter::CallbackExporter
impl core::marker::Send for mxaccess_callback::exporter::CallbackExporter
impl core::marker::Sync for mxaccess_callback::exporter::CallbackExporter
impl core::marker::Unpin for mxaccess_callback::exporter::CallbackExporter
impl core::marker::UnsafeUnpin for mxaccess_callback::exporter::CallbackExporter
impl !core::panic::unwind_safe::RefUnwindSafe for mxaccess_callback::exporter::CallbackExporter
impl !core::panic::unwind_safe::UnwindSafe for mxaccess_callback::exporter::CallbackExporter
pub struct mxaccess_callback::ExporterIdentities
pub mxaccess_callback::ExporterIdentities::callback_ipid: mxaccess_rpc::guid::Guid
pub mxaccess_callback::ExporterIdentities::oid: u64
pub mxaccess_callback::ExporterIdentities::oxid: u64
pub mxaccess_callback::ExporterIdentities::rem_unknown_ipid: mxaccess_rpc::guid::Guid
impl mxaccess_callback::exporter::ExporterIdentities
pub const fn mxaccess_callback::exporter::ExporterIdentities::fixed(oxid: u64, oid: u64, callback_ipid: mxaccess_rpc::guid::Guid, rem_unknown_ipid: mxaccess_rpc::guid::Guid) -> Self
pub fn mxaccess_callback::exporter::ExporterIdentities::random() -> Self
impl core::clone::Clone for mxaccess_callback::exporter::ExporterIdentities
pub fn mxaccess_callback::exporter::ExporterIdentities::clone(&self) -> mxaccess_callback::exporter::ExporterIdentities
impl core::cmp::Eq for mxaccess_callback::exporter::ExporterIdentities
impl core::cmp::PartialEq for mxaccess_callback::exporter::ExporterIdentities
pub fn mxaccess_callback::exporter::ExporterIdentities::eq(&self, other: &mxaccess_callback::exporter::ExporterIdentities) -> bool
impl core::fmt::Debug for mxaccess_callback::exporter::ExporterIdentities
pub fn mxaccess_callback::exporter::ExporterIdentities::fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result
impl core::hash::Hash for mxaccess_callback::exporter::ExporterIdentities
pub fn mxaccess_callback::exporter::ExporterIdentities::hash<__H: core::hash::Hasher>(&self, state: &mut __H)
impl core::marker::Copy for mxaccess_callback::exporter::ExporterIdentities
impl core::marker::StructuralPartialEq for mxaccess_callback::exporter::ExporterIdentities
impl core::marker::Freeze for mxaccess_callback::exporter::ExporterIdentities
impl core::marker::Send for mxaccess_callback::exporter::ExporterIdentities
impl core::marker::Sync for mxaccess_callback::exporter::ExporterIdentities
impl core::marker::Unpin for mxaccess_callback::exporter::ExporterIdentities
impl core::marker::UnsafeUnpin for mxaccess_callback::exporter::ExporterIdentities
impl core::panic::unwind_safe::RefUnwindSafe for mxaccess_callback::exporter::ExporterIdentities
impl core::panic::unwind_safe::UnwindSafe for mxaccess_callback::exporter::ExporterIdentities
pub const mxaccess_callback::IUNKNOWN_IID: mxaccess_rpc::guid::Guid