NK-WP-0055-T10: founder production-scope decisions; ADR-0018 defers Topaz
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 2s

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 4515@bnt-lap001
Assistant-Session: 0bf96127-6e04-41be-bfda-d11717c3f354
This commit is contained in:
tegwick 2026-10-27 22:24:54 +01:00
parent 656c35fc7b
commit e15b61c074
4 changed files with 89 additions and 8 deletions

View file

@ -327,7 +327,7 @@
| task | NK-WP-0055-T07 | todo | — | workplans/NK-WP-0055-security-platform-production-readiness.md |
| task | NK-WP-0055-T08 | todo | — | workplans/NK-WP-0055-security-platform-production-readiness.md |
| task | NK-WP-0055-T09 | wait | — | workplans/NK-WP-0055-security-platform-production-readiness.md |
| task | NK-WP-0055-T10 | todo | — | workplans/NK-WP-0055-security-platform-production-readiness.md |
| task | NK-WP-0055-T10 | done | — | workplans/NK-WP-0055-security-platform-production-readiness.md |
| task | NK-WP-0055-T11 | todo | — | workplans/NK-WP-0055-security-platform-production-readiness.md |
| task | NK-WP-0055-T12 | todo | — | workplans/NK-WP-0055-security-platform-production-readiness.md |
| task | NK-WP-0055-T13 | todo | — | workplans/NK-WP-0055-security-platform-production-readiness.md |

View file

@ -0,0 +1,65 @@
---
id: NK-ADR-0018
type: architecture-decision-record
title: "The access-engine Core Is the Production PDP; Topaz Is Deferred"
status: accepted
owner: net-kingdom
revision: "1"
decided: "2026-10-27"
last_reviewed: "2026-10-27"
review_interval: 12m
amends: [NK-ADR-0006]
---
# ADR-0018 - access-engine Core as Production PDP
**Status:** Accepted by Bernd Worsch on 2026-10-27, as hub decision `37464824-a939-415f-8a7a-5f81cbf498c8`
(NK-WP-0055-T10).
**Date:** 2026-10-27
**Decider:** Bernd Worsch
## Context
ADR-0006 and `docs/platform-identity-security-architecture.md` name Topaz as the first delegated policy decision point
(PDP) behind flex-auth, now access-engine. In practice Topaz exists only as an adapter shape (FLEX-WP-0004), and nothing
deploys it. Every live decision comes from the access-engine Go core.
The core already provides:
- tenant scope;
- relationship facts and inherited access;
- check, list-allowed and explain;
- caller authentication.
The core was shaped to Topaz's policy-plus-directory model from the start. The production readiness ledger (NK-WP-0055-T01)
lists the Topaz runtime as an open area.
## Decision
- The access-engine Go core is the production PDP. A delegated Topaz runtime is not required for production readiness, and
that readiness area is an accepted exception.
- The PDP readiness checks still apply, but they are now run against the core:
- health;
- data freshness;
- policy load status;
- fail-closed behaviour, verified per consumer through each consumer's `pep-stance.yaml`.
- The policy import gap that Topaz bundles would have closed moves to NK-WP-0055-T14. Either policies load without an image
rebuild, or rebuild-and-deploy is accepted as the import path.
- Topaz is no longer an expected audit source (NK-WP-0055-T11).
- Topaz is deferred, not rejected. ADR-0006's rule still holds for any future delegated PDP: it evaluates policy, and it
never becomes the canonical policy model, the identity provider or the control plane.
## Revisit when
- a tenant needs per-object sharing, or relationship data outgrows the core's relationship facts;
- the number of tenants or the depth of group nesting makes core evaluation a bottleneck;
- policy changes become too frequent for the T14 import path;
- the production declaration (NK-WP-0055-T09) reviews its accepted exceptions.
## Consequences
- There is one less runtime to operate, back up, audit and drill.
- Authorization availability is coupled to access-engine. HA is out of scope by the same decision.
- Reversibility is high: adding Topaz later extends the system rather than rebuilding it.
- Where `docs/platform-identity-security-architecture.md` describes Topaz as the first delegated PDP, read it with this
amendment.

View file

@ -15,18 +15,30 @@ Builder-mode acceptances count as **partial**. The definition is in
| # | Area | Status | Gap carried by |
|---|---|---|---|
| 1 | Platform root custody | partial | T10 (decisions), NK-WP-0054-T07 |
| 1 | Platform root custody | partial (single-holder custody: accepted exception) | T13, NK-WP-0054-T07 |
| 2 | MFA and identity | partial | RPF-WP-0065-T04 (SI-X4), NK-WP-0054-T04/T05/T06, T12 |
| 3 | Bootstrap and recovery | partial | T02–T04, T07 (NK-WP-0053), T08 |
| 4 | OpenBao runtime secrets | partial | T10, T07 (RPF-WP-0036-T03), T12 |
| 4 | OpenBao runtime secrets | partial (manual Shamir unseal approved) | T07 (RPF-WP-0036-T03), T12 |
| 5 | Secret rotation | partial | T06, T15, RPF-WP-0035, RPF-WP-0055-T01 |
| 6 | flex-auth (access-engine) policy state | partial | T14, FLEX-WP-0031, FLEX-WP-0024 |
| 7 | Topaz runtime | open | T10 (is Topaz required?), then T14 |
| 7 | Topaz runtime | **accepted exception** (ADR-0018: the core is the production PDP) | T12 (core checks), T14 |
| 8 | Tenant onboarding | partial | T11, T12 |
| 9 | Audit sink | open | T11, AUDIT-WP-0013-T02, AUDIT-WP-0015-T01 |
| 10 | Break-glass | open | T13 |
None of the ten areas is met. Three are open.
None of the ten areas is met. One is an accepted exception (7), and two are open (9, 10).
## Founder decisions, 2026-10-27 (hub decision `37464824`, NK-WP-0055-T10)
| Decision | Effect on the ledger |
|---|---|
| (a) Manual Shamir unseal is the approved production mechanism for now. | Area 4's unseal gap is closed. Its other gaps remain. |
| (b) Topaz is not required. The access-engine Go core is the production PDP ([ADR-0018](../adr/ADR-0018-access-engine-core-as-production-pdp.md)). | Area 7 is an accepted exception. Its health, freshness, load and fail-closed checks move to the core under T12, and Topaz leaves the T11 audit sources. |
| (c) The founder, as platform-root, holds all OpenBao unseal shares. This is an accepted exception to two-of-three custody. | Area 1's escrow gap becomes an exception. Item 4 (the offline king path with SSO down) stays open under T13. |
| (d) HA is out of scope for now. | No area changes. |
Each exception is reviewed at the production declaration (T09).
## Per area

View file

@ -233,10 +233,11 @@ their recorded hashes, or the founder accepts single-copy custody as an exceptio
```task
id: NK-WP-0055-T10
status: todo
status: done
priority: high
assignee: claude-code
needs_human: true
decision_id: "37464824-a939-415f-8a7a-5f81cbf498c8"
```
Decide what production requires:
@ -249,6 +250,8 @@ Decide what production requires:
2026-10-27 founder answers: (a) manual Shamir unseal is the approved mechanism for now; (c) the founder, as platform-root, holds the OpenBao unseal shares (single holder; two-of-three escrow holders not named); (d) HA stays out of scope for now. (b) Topaz is pending an explanation of the accepted-exception consequences.
2026-10-27: done. (b) accepted as an exception: the access-engine core is the production PDP, Topaz is deferred ([ADR-0018](../docs/adr/ADR-0018-access-engine-core-as-production-pdp.md)); (c) single-holder custody accepted as an exception. All answers are in hub decision `37464824` and the ledger. Exceptions are reviewed at T09.
## Get every audit source into the durable sink with one correlation id
```task
@ -261,7 +264,7 @@ state_hub_task_id: "93caa9e0-3d28-58ac-808a-47e15fe6d6ab"
Owners are audit-core (receiving), railiance-platform (OpenBao audit forwarding), railiance-cluster (Kubernetes API audit),
access-engine (AUDIT-WP-0013-T02 registration) and NetKingdom (identity-provider events and the correlation-id contract).
Topaz joins only if T10 keeps it.
Topaz is not a source (ADR-0018).
**Done when:** each owner has a task in its own workplan; identity, authorization, OpenBao, Kubernetes and workload records land
durably; one correlation id is defined and tested across the onboarding chain; audit-core has a recurring restore drill and
@ -278,7 +281,8 @@ state_hub_task_id: "c93fa290-663a-582c-a5b2-beb876fcff1e"
```
**Done when:** dated receipts exist for the live IAM issuer conformance run (NK-WP-0054-T04), caller-auth enforcement on every
access-engine release unit (only ops-warden is proven today), the live OpenBao auth methods and mounts against the committed
access-engine release unit (only ops-warden is proven today), the access-engine core's health, data freshness, policy load
status and per-consumer fail-closed stance (ADR-0018), the live OpenBao auth methods and mounts against the committed
policies, and the tenant onboarding completion test for `tenant:coulomb`.
## Record and drill break-glass with SSO down