diff --git a/AGENTS.md b/AGENTS.md index 3c70e07..4f3c677 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -215,13 +215,14 @@ cargo semver-checks check-release # before a release ## Architecture Context - `docs/architecture/` — the authoritative spec. Read it before - non-trivial changes. ADRs are numbered 001..048; OQs (open questions) + non-trivial changes. ADRs are numbered 001..050; OQs (open questions) track resolved/deferred decisions. - This crate unifies `alknet-call` and `alknet-channels` from the alknet mono-repo (`/workspace/@alkdev/alknet`). The source architecture docs were ported from `/workspace/@alkdev/alknet/docs/architecture/` and renumbered as - alkcall ADRs (001..048; ADR-048 was authored in this crate). The ALPN + alkcall ADRs (001..048; ADR-049 and later were authored in this + crate). The ALPN strings (`alk/call`, `alk/channels`) are wire-stable going forward (renamed from `alknet/` to `alk/` in v0.1.1, before the first published consumer). diff --git a/CHANGELOG.md b/CHANGELOG.md index 021f9e0..0b660fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -431,6 +431,10 @@ Vendored core types (`Connection`, `ProtocolHandler`, `BiStream`, (ADR-046), the channels protocol with openable-ALPNs-as-operations (ADR-047), and the `ChannelClient` transport-agnostic client. +[0.6.0]: https://git.alk.dev/alkdev/alkcall/releases/tag/v0.6.0 +[0.5.0]: https://git.alk.dev/alkdev/alkcall/releases/tag/v0.5.0 +[0.4.1]: https://git.alk.dev/alkdev/alkcall/releases/tag/v0.4.1 +[0.4.0]: https://git.alk.dev/alkdev/alkcall/releases/tag/v0.4.0 [0.3.1]: https://git.alk.dev/alkdev/alkcall/releases/tag/v0.3.1 [0.3.0]: https://git.alk.dev/alkdev/alkcall/releases/tag/v0.3.0 [0.2.0]: https://git.alk.dev/alkdev/alkcall/releases/tag/v0.2.0 diff --git a/docs/architecture/README.md b/docs/architecture/README.md index 5ba6ab7..4f51713 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -13,7 +13,7 @@ This crate unifies `alknet-call` and `alknet-channels` from the alknet mono-repo, plus the vendored core types formerly in `alknet-core`. The source architecture docs were ported from `/workspace/@alkdev/alknet/docs/architecture/` and renumbered as alkcall -ADRs (ADR-001..045). The ALPN strings (`alk/call`, `alk/channels`) +ADRs (ADR-001..050). The ALPN strings (`alk/call`, `alk/channels`) are wire-stable and unchanged — see ADR-004. ## Documents @@ -101,6 +101,8 @@ are wire-stable and unchanged — see ADR-004. | [046](decisions/046-publish-operation-type-and-handler-kind-sink.md) | Publish Operation Type and HandlerKind::Sink | `OperationType::Pub` (producer→consumer streaming); `SinkHandler` + `HandlerKind::Sink`; `call.published` wire event; `invoke_sink()` dispatch; `Subscription` renamed to `Sub` | | [047](decisions/047-openable-alpns-are-operations.md) | Openable ALPNs Are Operations | `channel/open` dissolves into per-ALPN ops `channels//sub`/`pub`; `channel_open` marker on `OperationSpec`; `ChannelCore` wrapper; extension-trait `ChannelOperationEnv`; connection-owner allocates `channel_id`; opener ledger (Gap 2 fix); ALPNs are call apps | | [048](decisions/048-dispatch-spine-gateway-module.md) | Dispatch Spine (feature-gated `gateway` module) | `alkcall::gateway` behind the `gateway` feature; `GatewayDispatch` invoke spine (deadline knob, re-rooted context) + `schema_disclosure_denial` (FORBIDDEN for ACL deny, spec-404 for Internal); promoted from alkhttp for hub/spoke reuse | +| [049](decisions/049-channel-open-establishment-phase.md) | Channel-Open Establishment Phase | `OpenEstablisher` + `register_openable_with_establisher` (awaited, bounded); typed `channel:open_failed` with `details.reason`; `Establishment.plan` (`ChannelPlan`) threaded to the `OpenHandler` (amendment 2); the `JoinHandle` data-plane lifetime contract | +| [050](decisions/050-pump-bidi-two-pump-helper.md) | `pump_bidi` Two-Pump Helper | `channels::pump_bidi` — shutdown-on-completion two-pump data plane pinned in one place (alknet ADR-078) | ## Relevant Open Questions @@ -272,7 +274,7 @@ feature flags) or in the downstream alknet crate. - `@alkdev/alknet: docs/architecture/` — the source architecture docs these were ported from (renumbered from alknet ADR-001..094 to alkcall - ADR-001..045) + ADR-001..048; ADR-049 and later were authored in this crate) - `@alkdev/alktype` — the binary struct engine; compiles BAST documents (e.g. `chunk-header.bast.json`) into readers/writers/validators - `@alkdev/pubsub` — the TypeScript EventEnvelope prior art the call @@ -288,5 +290,5 @@ feature flags) or in the downstream alknet crate. > TTY's wire format, ADR-082 for alknet-tls, ADR-086 for endpoint types). > These are ADRs for sibling crates that are not part of alkcall. They > retain their alknet numbering (052, 082, 086, etc.) — any ADR number -> outside the alkcall range 001..045 is an alknet source ADR, found at +> outside the alkcall range 001..048 is an alknet source ADR, found at > `/workspace/@alkdev/alknet/docs/architecture/decisions/`. \ No newline at end of file diff --git a/docs/architecture/channel-operations.md b/docs/architecture/channel-operations.md index d507755..f1c2119 100644 --- a/docs/architecture/channel-operations.md +++ b/docs/architecture/channel-operations.md @@ -470,6 +470,8 @@ All design decisions are documented as ADRs in [decisions/](decisions/). | [035](decisions/035-channels-pure-channel-multiplexing.md) | Pure Channel Multiplexing | No stream_types; handler owns sub-mux | | [021](decisions/021-streaming-handler-for-subscriptions.md) | StreamingHandler | The machinery `channel/resources/subscribe` uses | | [046](decisions/046-publish-operation-type-and-handler-kind-sink.md) | Pub Operation Type | The `Pub`/`Sub` primitives the per-ALPN open ops build on | +| [049](decisions/049-channel-open-establishment-phase.md) | Channel-Open Establishment Phase | The establisher hook; typed `channel:open_failed`; `Establishment.plan` (amendment 2); the `JoinHandle` lifetime contract | +| [050](decisions/050-pump-bidi-two-pump-helper.md) | `pump_bidi` Two-Pump Helper | The data-plane helper openable-ALPN handlers await inline | | [026](decisions/026-forwarded-for-identity.md) | Forwarded-For Identity | The auth chain for hub-relayed opens (and why the cap is per direct-caller, not per `forwarded_for`) | | [011](decisions/011-dynamic-resource-ownership-for-runtime-spawned-resources.md) | Dynamic Resource Ownership | The parallel — a channel slot is a resource, the cap is a quota check; `resource_id_path` works again under per-ALPN ops | @@ -477,6 +479,9 @@ All design decisions are documented as ADRs in [decisions/](decisions/). - ADR-047: openable ALPNs are operations (the unifying ADR — per-ALPN open ops, `channel_open` marker, `ChannelCore` wrapper, opener ledger) +- ADR-049: channel-open establishment phase (the establisher hook, + `channel:open_failed`, the plan payload) +- ADR-050: `pump_bidi` (the two-pump helper) - ADR-037: channel lifecycle operations (amended by ADR-047) - ADR-041: per-identity channel cap (amended by ADR-047 §7 — opener ledger, every teardown path)