glm-5.3-flash
23c9b28c6b
fix(review 005 Unit 2): op/register serving-registry collision gate (G-03)
...
- op_register_handler takes the serving registry alongside the
connection and rejects announced names that collide with the serving
side's own registrations (ALREADY_EXISTS regardless of replace).
Peer-announced ops may collide with peer-announced ops (replace
governs, the reconnect path) but never shadow the deployment's own
ops: the connection overlay resolves before base in PeerCompositeEnv,
so an unscreened same-name announce would silently rewrite what a
wire-dispatched handler's ctx.env.invoke resolves. Composition
authority (ADR-018) stays with the deployer.
- ADR-022 amendment (2026-09-04): collision policy recorded in the
2026-09-03 amendment's op/register section (rationale + visibility
irrelevance); status line notes the sub-amendment.
- Gates: base-External collision rejected even with replace (overlay
stays clean, serving registration untouched); Internal base op
equally protected; overlay/overlay collisions still follow replace;
nested composition of a base op resolves the serving side's own op
after an unrelated announce (real compose_root_env env shape).
- PeerCompositeEnv resolution order deliberately unchanged.
Verification: cargo test 587 / --all-features 604, clippy
(all-targets, all-features, wasm32) clean, fmt clean, doc clean.
Refs docs/reviews/005-...md (G-03; Unit 3 open).
2026-09-04 09:40:11 +00:00
glm-5.3-flash
f84d214173
feat: per-session fork registry, connect-side serving loop, op/register (review 004 Units 1-3)
...
Remediates all six findings of review 004 (per-connection dispatch
resolution and client-side op serving). All claims re-verified in
source before remediation; F-02's member list gains ScopedPeerEnv
(also Clone — fork surface simpler than estimated).
- OperationRegistry: interior mutability (parking_lot RwLock on both
maps); register takes &self; registration/list_operations return
owned clones; fork() deep-copies registrations + cached publish-schema
validators (F-02/F-03); OperationRegistryBuilder::from_registry.
- install_bootstrap_discovery: services/list, services/list-peers,
services/schema registered closed over the fork itself, so
per-session openables are discoverable and services/schema answers
from the fork (F-06).
- Dispatcher::serve_single_stream: full-duplex single-stream loop —
call.requested dispatches inbound; responded/completed/error resolve
outbound pendings; aborted tries both tables (in-flight sink aborts
+ pending cascade); published routes inbound sinks (F-04).
- ChannelClient::from_connection_with_serving(connection,
Option<ServingConfig>): opt-in serving; from_connection keeps the
pure-consumer default.
- registry::op_register: OpRegisterRequest wire DTO (spec in
services/schema JSON + replace flag), op_register_spec,
op_register_handler (rebuild -> forwarding stub -> register_imported,
forced Internal/FromCall), announce_op; CallError::already_exists;
spec_to_json_pub; from_call's rebuild_spec_for + forwarding-handler
constructors crate-shared (F-05).
- ADR-047 §4 amendment #2 : per-session fork is the dispatch-registry
mechanism; overlay stays nested-invocation/peer-announced landing
zone (F-01/F-02).
- ADR-022 amendment 2026-09-03: bootstrap-op set (services/list,
services/schema, op/register), opt-in connect-side serving, op/register
wire shape (F-04/F-05).
- alkhttp ADR-048 reconciliation note + OQ-05 re-pointed at the alkcall
ADRs (Unit 1b).
- Review 004 status -> remediated; remediation log with gates.
Verification:
- cargo test: 581 passed, 0 failed (565 baseline + 16 new)
- cargo test --all-features: 598 passed, 0 failed
- cargo clippy --all-targets -- -D warnings: clean
- cargo clippy --all-features --all-targets -- -D warnings: clean
- cargo clippy --target wasm32-unknown-unknown -- -D warnings: clean
- cargo fmt --check: clean
- cargo doc --no-deps: clean
Gates: fork_registry_open_op_resolves_and_is_discoverable (open op via
fork + services/list shows openable + services/schema validates),
serving_loop_hub_to_consumer_call_resolves (hub->consumer call through
consumer's serving loop, consumer->hub still resolves),
op_register_announce_then_hub_call_routes_back_to_consumer (announce ->
overlay -> hub call -> forwarding stub -> consumer serves).
2026-09-03 17:32:45 +00:00
glm-5.2
cc470a363a
docs: port architecture specs + 45 ADRs from alknet, renumbered
...
Port the call + channels architecture documentation from the alknet
mono-repo into docs/architecture/, renumbered as alkcall ADR-001..045.
Renumbering map (alknet -> alkcall):
Core: 001,002,004,006,007,011,065,070,092,014,050,091 -> 001-012
Call: 005,064,012,023,015,022,024,016,049,017,028,029,030,032,066,069,067,068 -> 013-030
Shared: 003,009,013 -> 031-033
Channels: 071,093,072,073,074,075,076,094,079,080,081,089 -> 034-045
3 superseded/reversed ADRs kept for historical trail:
- ADR-013 (irpc foundation, superseded by ADR-014)
- ADR-023 (peer-scoped filtering, superseded by ADR-024)
- ADR-077 (TTY inside channels, reversed by ADR-035 — not ported, TTY-only)
Ported docs (11 spec files + README + open-questions):
- call-README.md, call-protocol.md, operation-registry.md, client-and-adapters.md
- channels-README.md, channels-overview.md, channels-wire.md, channels-connection.md, channels-adapter.md, channel-operations.md, channel-client.md
- README.md (index with doc table, ADR table grouped by category, key principles)
- open-questions.md (lean — 30 OQs, renumbered OQ-01..030; includes new OQ-22 for the pub/sub gap)
Cross-reference rewriting:
- All ADR-NNN references rewritten single-pass (no chaining bug)
- Markdown link paths fixed
- Title lines aligned with filenames
- Non-ported ADR refs (052, 082, 086, etc.) left as-is with README note
The open-questions.md includes OQ-22 (new): the call protocol pub/sub
gap — subscribe exists but pub does not, needed for channels
channel/resources/subscribe fan-out. This is the next ADR to write
(alkcall ADR-046).
2026-08-12 07:06:57 +00:00