diff --git a/Cargo.lock b/Cargo.lock index 3bbc30c..e041cab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,9 +27,9 @@ dependencies = [ [[package]] name = "alkcall" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0e415a03f77446ba446b3a758dc7846283b217a356376499a74a836b10e875a" +checksum = "d4116dba284601e3337e918d4a4256706e43dd8bb6a30095bf96d664ae58d74a" dependencies = [ "async-trait", "bytes", @@ -1485,7 +1485,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -1860,7 +1860,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -2679,7 +2679,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] diff --git a/docs/reviews/006-alkcall-0.3.0-consequence-review.md b/docs/reviews/006-alkcall-0.3.0-consequence-review.md index a0db8fc..2395cb5 100644 --- a/docs/reviews/006-alkcall-0.3.0-consequence-review.md +++ b/docs/reviews/006-alkcall-0.3.0-consequence-review.md @@ -2,10 +2,12 @@ ## Status -Unit 2 + Unit 3 remediated and verified (`030c5ef`). Remaining: Unit 4 -(docs reconciliation). UP-02 decided (recorded below). One new -upstream gap surfaced during the gates (UP-03 — alkcall-side). See -Remediation log. +All units landed: Unit 2 + Unit 3 remediated and verified (`030c5ef`); +Unit 4 (docs reconciliation) landed with the 0.3.1 consumption +(`Cargo.lock` bump + the `services/list-peers` discovery gate). UP-02 +decided (recorded below). UP-03 fixed in alkcall 0.3.1 (`fd21230`, +ADR-030) and asserted by the extended WS-path gate. See Remediation +log. ## Scope @@ -447,13 +449,20 @@ cargo doc --no-deps → clean --- -## Unit 4 — spec reconciliation (docs) — open +## Unit 4 — spec reconciliation (docs) — LANDED (with the 0.3.1 consumption) -As planned in this review's remediation plan: OQ-05 resolution → -resolved, ADR-067 v1-cut note + ADR-048 amendment note updated, -websocket.md §"Data channels for browsers" status block removed, the -idle-knob deployment note surfaced, and the `op/register` ACL posture -(UP-02's decision) recorded where a deployer reads. +As planned in this review's remediation plan: OQ-05 resolved, +ADR-067 v1-cut note + ADR-048 amendment note updated to the landed +state, websocket.md §"Data channels for browsers" status block removed +(the section now documents the landed surface: `with_ws_openable_alpns`, +the `OpenableAlpns` fallback, cap policy, discovery, gates), the +idle-knob deployment note surfaced (silent data channels make the 60 s +default bite more often; semantics unchanged), the `op/register` ACL +posture (UP-02's decision) recorded in ADR-048's landed note, and the +UP-03 alkcall-side gap closed by 0.3.1 and asserted alkhttp-side (the +extended `op/register` gate). The alknet-ADR-044 §5 pointer was +checked: not stale (the rationale lives in this crate's ADR-044 §5; +the alknet-ADR-043 pointers are correctly marked parked/not-ported). --- @@ -489,6 +498,21 @@ next alkcall review pass; the alkhttp-side gate asserts the overlay-landing + collision semantics instead, which is the behavior Unit 2 actually wires, and is not blocked by UP-03. +**LANDED in alkcall 0.3.1** (2026-09-04, `fd21230`): implemented as +alkcall ADR-030 — `OperationEnv` gains a defaulted +`list_operation_names`; `OverlayOperationEnv` overrides it; +`PeerCompositeEnv::peer_operations` delegates to the peer overlay, +and its `list_operation_names` aggregates session + connections + +base. Upstream gate: +`announced_op_is_discoverable_via_services_list_peers`. The version +pin here is `0.3` (semver-compatible), so the fix arrives through a +`Cargo.lock` bump with no source change; the WS-path gate that +originally surfaced UP-03 now asserts the discovery promise — +`op_register_served_per_session_and_collision_is_already_exists` +gained the `services/list-peers` step (announce → the `alice` peer +entry lists `consumer/exec`) and passes against 0.3.1 (it fails +against 0.3.0, verified by the original draft). + ### UP-02 decision (recorded) `op/register` is served per WS session with diff --git a/tests/ws_upgrade_session.rs b/tests/ws_upgrade_session.rs index bb2b15a..4887ab9 100644 --- a/tests/ws_upgrade_session.rs +++ b/tests/ws_upgrade_session.rs @@ -1345,6 +1345,34 @@ async fn op_register_served_per_session_and_collision_is_already_exists() { assert_eq!(env.r#type, EVENT_RESPONDED, "got {}", env.r#type); assert_eq!(env.payload["output"]["registered"], true); + // The announced op is discoverable via services/list-peers: the + // peer entry keyed by the connection identity (alice) lists it + // (UP-03, fixed in alkcall 0.3.1). + let peers = call_and_await( + &mut ws, + "req-list-peers", + "services/list-peers", + serde_json::json!({}), + ) + .await; + assert_eq!(peers.r#type, EVENT_RESPONDED, "got {}", peers.r#type); + let peer_entry = peers.payload["output"]["peers"] + .as_array() + .expect("peers array") + .iter() + .find(|p| p["peer_id"] == "alice") + .expect("alice peer entry present"); + let peer_op_names: Vec<&str> = peer_entry["operations"] + .as_array() + .expect("peer operations array") + .iter() + .filter_map(|o| o["name"].as_str()) + .collect(); + assert!( + peer_op_names.contains(&"consumer/exec"), + "announced op discoverable via services/list-peers: {peer_entry}" + ); + // The announced op landed in the overlay: a second announce of the // same name without `replace` hits the overlay collision gate. let spec = OperationSpec::new(