Follow-up to #499 which fixed the worker path and http.py but missed
two code paths in memory_engine.py:
1. `_retain_batch_async_internal` (line ~2185) still passed
`request_context.tenant_id` which is always None for HTTP requests
(tenant_id is never populated by the HTTP layer — the schema is
stored in the _current_schema contextvar by _authenticate_tenant).
2. `_build_retain_outbox_callback._callback` captured the `schema`
parameter at closure creation time. In the HTTP path, http.py builds
the callback *before* calling retain_batch_async, but _current_schema
is only set inside retain_batch_async by _authenticate_tenant — so
the captured schema is always None. Fixed by resolving schema at
callback invocation time via `schema or _current_schema.get()`.
Both issues cause `relation "webhooks" does not exist` errors that
abort the entire retain transaction in multi-tenant deployments,
silently rolling back all inserted memory data.