diff --git a/.agents/rules/handlers.md b/.agents/rules/handlers.md index cd6200f1..19a0afce 100644 --- a/.agents/rules/handlers.md +++ b/.agents/rules/handlers.md @@ -69,8 +69,12 @@ boundary, operating on the `AsyncResult` — not thrown exceptions). Middleware accumulates context with bounded generics (`TContextOut extends TContextIn`, amqp-contract's model): `next({ context })` extends what downstream stages and the implementation see; `next({ input })` substitutes the input (re-validated). -The client has the mirror-image seam: `TypedClient.create({ interceptors })` -wraps start/execute/signalWithStart and handle-level signal/query/update. +The client has **no** mirror-image seam, deliberately: client interceptors were +cut in `533c796` because every client method already answers an `AsyncResult`, +so wrapping a call is composing one — `.tap`, `.flatMap`, `.mapErrCases` at the +call site, no registration and no framework hook to learn. Middleware exists on +the activity side because there is no `AsyncResult` in the caller's hand to +compose: the platform invokes the activity, not the application. ## Workflow Declaration diff --git a/README.md b/README.md index bedc27ba..cfd378f5 100644 --- a/README.md +++ b/README.md @@ -126,8 +126,8 @@ partial state, nothing to unwind. [unthrown](https://github.com/btravstack/unthrown), with a separate `defect` channel that keeps genuine bugs loud - **Child workflows** — typed, including across contracts and teams -- **Schedules, cancellation scopes, continue-as-new, activity middleware, client - interceptors** — all contract-aware +- **Schedules, cancellation scopes, continue-as-new, activity middleware** — + all contract-aware - **Testing utilities** — time-skipping (no Docker) and real-server (testcontainers) fixtures - **Nexus** — not implemented; see