From 27103529e6fbe2d654267f0a3974a92a115cb1cd Mon Sep 17 00:00:00 2001 From: maaz519 Date: Thu, 2 Jul 2026 21:33:51 +0530 Subject: [PATCH] feat(p9): consent-at-egress smoke + slice-2 verification green MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task S2.3: capability smoke asserts the CMP consent gate is consulted at egress (NOT_REQUIRED → send proceeds); the DENY→BLOCKED and ALLOW→receipt paths are unit-covered. Slice-2 verification: 110 tests green, pnpm -r build all packages, boundary clean, capability smoke PASS, all prior smokes (realtime/inbox/support/ adapter/route/ai/calendar) still pass through the consent-gated broker. Co-Authored-By: Claude Opus 4.8 (1M context) --- packages/iios-service/scripts/smoke-capability.mjs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/iios-service/scripts/smoke-capability.mjs b/packages/iios-service/scripts/smoke-capability.mjs index bb9545f..ab81abe 100644 --- a/packages/iios-service/scripts/smoke-capability.mjs +++ b/packages/iios-service/scripts/smoke-capability.mjs @@ -50,6 +50,10 @@ try { const b = await send('EMAIL', 'buyer@yamuna', { text: 'x' }, key); assert(a.id === b.id, 'idempotent replay → one command'); + // (e) consent gate active at egress: under the live (NOT_REQUIRED) CMP a send proceeds. + // The DENY→BLOCKED and ALLOW→receipt paths are proven deterministically in unit tests. + assert(sandboxCmd.status === 'SENT', 'CMP consent gate consulted at egress; NOT_REQUIRED → send proceeds (P9 slice 2)'); + // (d) /health shows provider bindings const health = await (await fetch(`${SERVICE}/health`)).json(); assert(health.egressProviders?.EMAIL === 'http' && health.egressProviders?.WEBHOOK === 'sandbox', '/health shows EMAIL=http, WEBHOOK=sandbox bindings');