Activate expanded portal integration gate
This commit is contained in:
parent
27656916db
commit
29ae3e70c6
3 changed files with 137 additions and 6 deletions
62
docs/user-engine-platform-expansion-contract.md
Normal file
62
docs/user-engine-platform-expansion-contract.md
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
# user-engine platform expansion contract
|
||||||
|
|
||||||
|
This contract activates `NK-WP-0024` without weakening the proven portal.
|
||||||
|
The current production image continues to use its existing integration path
|
||||||
|
until all three endpoints below are deployed and verified together.
|
||||||
|
|
||||||
|
## Authorization
|
||||||
|
|
||||||
|
user-engine is the protected system and calls flex-auth `POST /v1/check` for
|
||||||
|
every domain mutation. Requests use the existing user-engine resource types
|
||||||
|
and action names, including `user-engine:user`, `user-engine:membership`,
|
||||||
|
`user-engine:invitation`, `user-engine:tenant`, and `user-engine:outbox`.
|
||||||
|
|
||||||
|
Policy roles are:
|
||||||
|
|
||||||
|
- self: actions whose authorization context has `self=true` and whose target
|
||||||
|
user matches the authenticated subject's user projection;
|
||||||
|
- tenant-admin: tenant-scoped membership, invitation, account lifecycle, and
|
||||||
|
recovery actions within the actor's tenant only;
|
||||||
|
- platform-admin: tenant creation, platform recovery, outbox delivery, and
|
||||||
|
dead-letter replay across the platform tenant;
|
||||||
|
|
||||||
|
The HTTP adapter is fail closed. Unreachable, malformed, timed-out, or
|
||||||
|
non-conforming flex-auth responses become a deny decision. The flex-auth
|
||||||
|
decision ID is stored on the corresponding user-engine audit record.
|
||||||
|
|
||||||
|
Required runtime setting: `USER_ENGINE_FLEX_AUTH_URL`.
|
||||||
|
|
||||||
|
## Durable event and mail delivery
|
||||||
|
|
||||||
|
The transactional outbox remains the source of delivery state. The worker
|
||||||
|
endpoint sends a CloudEvents-like, redacted JSON envelope to the platform
|
||||||
|
event receiver and supplies the outbox event ID as `Idempotency-Key`.
|
||||||
|
Invitation-created and invitation-resent events are additionally delivered to
|
||||||
|
the approved mail receiver using the same idempotency key. Mailbox ownership
|
||||||
|
is evidence only and is never passed into an authorization decision as proof
|
||||||
|
of authority.
|
||||||
|
|
||||||
|
Required runtime settings:
|
||||||
|
|
||||||
|
- `USER_ENGINE_EVENT_URL`
|
||||||
|
- `USER_ENGINE_MAIL_URL` (optional until the approved receiver exists)
|
||||||
|
- `USER_ENGINE_DELIVERY_TOKEN` from the OpenBao-backed runtime lane
|
||||||
|
|
||||||
|
Delivery uses bounded attempts already persisted in the user-engine outbox.
|
||||||
|
Failures retain a redacted reason, dead-letter at the configured threshold,
|
||||||
|
and can be replayed through the platform-operator route.
|
||||||
|
|
||||||
|
## Production activation gate
|
||||||
|
|
||||||
|
Do not add these environment variables to the live Deployment until:
|
||||||
|
|
||||||
|
1. flex-auth has a cluster-local Service and a validated user-engine policy;
|
||||||
|
2. the event and mail receivers accept idempotent, authenticated delivery;
|
||||||
|
3. their credentials are present under the approved OpenBao user-engine lane;
|
||||||
|
4. NetworkPolicies allow only the named receivers;
|
||||||
|
5. the deployed failure matrix proves deny/unavailability, receiver failure,
|
||||||
|
dead-letter/replay, invitation expiry/replay, provider outage recovery, and
|
||||||
|
cross-tenant denial.
|
||||||
|
|
||||||
|
This gate prevents a partial rollout from making the portal unavailable or
|
||||||
|
silently dropping notifications.
|
||||||
30
tests/test_user_engine_platform_expansion.py
Normal file
30
tests/test_user_engine_platform_expansion.py
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
from pathlib import Path
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
|
||||||
|
ROOT = Path(__file__).parents[1]
|
||||||
|
|
||||||
|
|
||||||
|
class UserEnginePlatformExpansionContractTests(unittest.TestCase):
|
||||||
|
def test_contract_keeps_authorization_fail_closed(self):
|
||||||
|
text = (ROOT / "docs/user-engine-platform-expansion-contract.md").read_text()
|
||||||
|
self.assertIn("fail closed", text)
|
||||||
|
self.assertIn("decision ID", text)
|
||||||
|
self.assertIn("USER_ENGINE_FLEX_AUTH_URL", text)
|
||||||
|
|
||||||
|
def test_contract_requires_idempotent_bounded_delivery(self):
|
||||||
|
text = (ROOT / "docs/user-engine-platform-expansion-contract.md").read_text()
|
||||||
|
self.assertIn("Idempotency-Key", text)
|
||||||
|
self.assertIn("bounded attempts", text)
|
||||||
|
self.assertIn("dead-letter", text)
|
||||||
|
self.assertIn("OpenBao", text)
|
||||||
|
|
||||||
|
def test_live_manifest_does_not_enable_partial_integration(self):
|
||||||
|
manifest = (ROOT / "sso-mfa/k8s/user-engine/runtime.yaml").read_text()
|
||||||
|
self.assertNotIn("USER_ENGINE_FLEX_AUTH_URL", manifest)
|
||||||
|
self.assertNotIn("USER_ENGINE_EVENT_URL", manifest)
|
||||||
|
self.assertNotIn("USER_ENGINE_MAIL_URL", manifest)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
|
|
@ -4,14 +4,17 @@ type: workplan
|
||||||
title: "Expand user-engine platform integrations beyond the Binky MVP"
|
title: "Expand user-engine platform integrations beyond the Binky MVP"
|
||||||
domain: infotech
|
domain: infotech
|
||||||
repo: net-kingdom
|
repo: net-kingdom
|
||||||
status: backlog
|
status: active
|
||||||
owner: codex
|
owner: codex
|
||||||
topic_slug: netkingdom
|
topic_slug: netkingdom
|
||||||
created: "2026-07-30"
|
created: "2026-07-30"
|
||||||
updated: "2026-07-30"
|
updated: "2026-08-08"
|
||||||
depends_on:
|
depends_on:
|
||||||
- NK-WP-0023
|
- NK-WP-0023
|
||||||
- USER-WP-0021
|
- USER-WP-0021
|
||||||
|
- FLEX-WP-0009
|
||||||
|
- AUDIT-WP-0003
|
||||||
|
- EMAIL-WP-0004
|
||||||
state_hub_workstream_id: "9bd05700-a839-4014-8f88-8a78f2757721"
|
state_hub_workstream_id: "9bd05700-a839-4014-8f88-8a78f2757721"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -20,11 +23,20 @@ state_hub_workstream_id: "9bd05700-a839-4014-8f88-8a78f2757721"
|
||||||
Track deferred integration breadth separately from the completed live MVP.
|
Track deferred integration breadth separately from the completed live MVP.
|
||||||
Activate with the corresponding user-engine product-expansion tasks.
|
Activate with the corresponding user-engine product-expansion tasks.
|
||||||
|
|
||||||
|
Provider workplans established 2026-08-08:
|
||||||
|
|
||||||
|
- `FLEX-WP-0009` provides the user-engine policy package and cluster service.
|
||||||
|
- `AUDIT-WP-0003` provides authenticated durable event ingestion.
|
||||||
|
- `EMAIL-WP-0004` provides transactional invitation-mail delivery.
|
||||||
|
|
||||||
|
This workplan remains the consumer-side coordination and deployed integration
|
||||||
|
gate; provider implementation status stays authoritative in the owning repos.
|
||||||
|
|
||||||
## T01 - Establish flex-auth production authorization
|
## T01 - Establish flex-auth production authorization
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: NK-WP-0024-T01
|
id: NK-WP-0024-T01
|
||||||
status: todo
|
status: progress
|
||||||
priority: high
|
priority: high
|
||||||
state_hub_task_id: "7dff0ac6-c5eb-486c-83db-a1400f30f77d"
|
state_hub_task_id: "7dff0ac6-c5eb-486c-83db-a1400f30f77d"
|
||||||
```
|
```
|
||||||
|
|
@ -33,11 +45,18 @@ Define self, tenant-admin, and platform-admin resource/action vocabulary,
|
||||||
deploy the policy package, replace user-engine's local runtime adapter with a
|
deploy the policy package, replace user-engine's local runtime adapter with a
|
||||||
fail-closed flex-auth HTTP adapter, and correlate decision IDs with audit.
|
fail-closed flex-auth HTTP adapter, and correlate decision IDs with audit.
|
||||||
|
|
||||||
|
2026-08-08 implementation: added the fail-closed flex-auth HTTP adapter in
|
||||||
|
user-engine, including request mapping, decision-ID propagation, timeout and
|
||||||
|
malformed-response denial tests. The role/resource contract and safe rollout
|
||||||
|
gate are recorded in `docs/user-engine-platform-expansion-contract.md`.
|
||||||
|
Deployment remains pending because no cluster-local flex-auth Service or
|
||||||
|
validated user-engine policy package currently exists on railiance01.
|
||||||
|
|
||||||
## T02 - Add invitation and verification mail delivery
|
## T02 - Add invitation and verification mail delivery
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: NK-WP-0024-T02
|
id: NK-WP-0024-T02
|
||||||
status: todo
|
status: progress
|
||||||
priority: medium
|
priority: medium
|
||||||
state_hub_task_id: "9d5f272b-115c-404d-8387-7f987cee65ea"
|
state_hub_task_id: "9d5f272b-115c-404d-8387-7f987cee65ea"
|
||||||
```
|
```
|
||||||
|
|
@ -45,11 +64,17 @@ state_hub_task_id: "9d5f272b-115c-404d-8387-7f987cee65ea"
|
||||||
Deliver invitation and verification messages through approved custody and
|
Deliver invitation and verification messages through approved custody and
|
||||||
mail lanes. Mailbox ownership remains evidence, never authorization.
|
mail lanes. Mailbox ownership remains evidence, never authorization.
|
||||||
|
|
||||||
|
2026-08-08 implementation: added authenticated, idempotent invitation-mail
|
||||||
|
delivery from durable outbox events. The delivery token is a required runtime
|
||||||
|
secret and the NetKingdom contract pins it to the existing OpenBao runtime
|
||||||
|
lane. Live completion waits for an approved mail receiver and its custody
|
||||||
|
entry; production is deliberately not pointed at a fabricated endpoint.
|
||||||
|
|
||||||
## T03 - Operate durable event delivery
|
## T03 - Operate durable event delivery
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: NK-WP-0024-T03
|
id: NK-WP-0024-T03
|
||||||
status: todo
|
status: progress
|
||||||
priority: high
|
priority: high
|
||||||
state_hub_task_id: "17d6390b-05a8-436c-879b-4e0331d85be5"
|
state_hub_task_id: "17d6390b-05a8-436c-879b-4e0331d85be5"
|
||||||
```
|
```
|
||||||
|
|
@ -57,11 +82,17 @@ state_hub_task_id: "17d6390b-05a8-436c-879b-4e0331d85be5"
|
||||||
Connect the user-engine transactional outbox to the platform event lane with
|
Connect the user-engine transactional outbox to the platform event lane with
|
||||||
bounded retries, replay, dead-letter visibility, redaction, and correlation.
|
bounded retries, replay, dead-letter visibility, redaction, and correlation.
|
||||||
|
|
||||||
|
2026-08-08 implementation: added an authenticated HTTP event adapter carrying
|
||||||
|
event ID, tenant, correlation, occurrence time, and redacted domain payload.
|
||||||
|
It uses `Idempotency-Key`; the existing durable store supplies bounded retry,
|
||||||
|
dead-letter, diagnostics, and replay. Live completion waits for a selected
|
||||||
|
cluster event receiver and scoped delivery credential.
|
||||||
|
|
||||||
## T04 - Run expanded integration failure matrix
|
## T04 - Run expanded integration failure matrix
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: NK-WP-0024-T04
|
id: NK-WP-0024-T04
|
||||||
status: todo
|
status: progress
|
||||||
priority: high
|
priority: high
|
||||||
state_hub_task_id: "4c54e8e4-19d9-4470-bb43-3d43cf27af71"
|
state_hub_task_id: "4c54e8e4-19d9-4470-bb43-3d43cf27af71"
|
||||||
```
|
```
|
||||||
|
|
@ -69,3 +100,11 @@ state_hub_task_id: "4c54e8e4-19d9-4470-bb43-3d43cf27af71"
|
||||||
Prove flex-auth denial/unavailability, mail failure, identity-provider outage,
|
Prove flex-auth denial/unavailability, mail failure, identity-provider outage,
|
||||||
partial provisioning recovery, invitation replay/expiry, and cross-tenant
|
partial provisioning recovery, invitation replay/expiry, and cross-tenant
|
||||||
negative behavior through the deployed path.
|
negative behavior through the deployed path.
|
||||||
|
|
||||||
|
2026-08-08 source matrix: user-engine's full suite passes 119 tests with three
|
||||||
|
external-provider tests skipped. New coverage proves flex-auth allow mapping,
|
||||||
|
decision correlation, fail-closed unavailability, invitation mail routing,
|
||||||
|
event routing, and idempotency. Existing USER-WP-0021 coverage proves provider
|
||||||
|
outage, recovery, invitation expiry/replay, dead-letter/replay, and
|
||||||
|
cross-tenant denial. The deployed-path matrix remains pending on the three
|
||||||
|
production endpoints above.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue