2026-10-31 14:19:08 +01:00
---
id: FLEX-WP-0040
type: workplan
title: "Bounded execution PDP gate: decide executor steps under an approved admission"
domain: infotech
repo: access-engine
2026-10-31 15:33:25 +01:00
status: active
2026-10-31 14:19:08 +01:00
flavor: implementation
owner: access-engine
created: "2026-10-31"
updated: "2026-10-31"
related: [NK-WP-0056, FLEX-WP-0039, FLEX-WP-0031]
2026-10-31 14:44:55 +01:00
state_hub_workstream_id: "1b0a9f9e-9d09-52da-8dd0-8269dd3d27ec"
2026-10-31 14:19:08 +01:00
---
# FLEX-WP-0040 — Bounded execution PDP gate
NetKingdom's proposed Bounded Execution Admission v0.1 (NK-WP-0056) lets the
founder approve, at `aal2` , an exact digested admission that a bounded executor
consumes once. Owner answer: `docs/bounded-execution-admission-pdp.md` . PDP
gating is in scope and recommended for production; the T06 pilot may run on
local enforcement without it.
Today the typed task path (`docs/trusted-service-task-source.md` ) serves only
the secrets-engine v2 contract, requires an unconsumed claim, and the Approval
claim carries no approver assurance. Everything below lands as `proposed`
source, evaluated in tests only. No deployment, caller trust or credential is
admitted by this workplan.
## 1. Settle the claim inputs with approval-engine
```task
id: FLEX-WP-0040-T01
status: wait
priority: high
2026-10-31 14:44:55 +01:00
state_hub_task_id: "2fe53d9e-738c-5b1f-ab05-96d83894d47e"
2026-10-31 14:19:08 +01:00
```
Wait: approval-engine answers to NK-WP-0056-T02 (binding to
`{admission_id, admission_digest}` , approver assurance `aal2` , consume scope)
plus our two additions: `consumed_by` and `consumed_at` in the claim. Record
the agreed claim fields here. Gate: written claim field list with owner ack.
## 2. Pack owner and semantic review
```task
id: FLEX-WP-0040-T02
status: wait
priority: medium
2026-10-31 14:44:55 +01:00
state_hub_task_id: "a7f9a307-01a5-56a6-9c96-fdb4c83118f5"
2026-10-31 14:19:08 +01:00
```
Wait: founder confirms the proposal — access-engine owns pack mechanics and
fixtures; NetKingdom (BEA owner) owns what a ceiling admits; gate-house reviews
authority-ceiling semantics. Gate: decision recorded.
## 3. Generalise the typed path caller map
```task
id: FLEX-WP-0040-T03
status: todo
priority: medium
2026-10-31 14:44:55 +01:00
state_hub_task_id: "c9382486-55d9-5b40-b64e-d7c14343bbf6"
2026-10-31 14:19:08 +01:00
```
Replace the single hard-wired secrets-engine mapping with an owner-installed
caller map; first new entry `system:serviceaccount:sso:nk-bind-executor` →
`service:nk-bind-executor` . Gate: existing secrets-engine v2 tests unchanged
and passing; unknown service accounts refuse; generic `/v1/check` still refuses
task execution.
## 4. Vocabulary and admission digest
```task
id: FLEX-WP-0040-T04
status: todo
priority: medium
depends_on: [FLEX-WP-0040-T01]
2026-10-31 14:44:55 +01:00
state_hub_task_id: "226afa23-3f6f-5b25-a2e6-48e7d086d597"
2026-10-31 14:19:08 +01:00
```
Add actions `start` and `execute-step` on resource type
`bounded-execution-admission` (system `net-kingdom` ). The executor submits the
admission document; access-engine recomputes its digest by NK's BEA digest rule
and requires equality with the claim's admission digest. Gate: digest fixtures
shared with NetKingdom's validator agree byte-for-byte.
## 5. Policy pack `net-kingdom.bounded-execution` (DENY by default)
```task
id: FLEX-WP-0040-T05
status: todo
priority: medium
depends_on: [FLEX-WP-0040-T02, FLEX-WP-0040-T03, FLEX-WP-0040-T04]
2026-10-31 14:44:55 +01:00
state_hub_task_id: "cc5e1435-57e0-5011-b8f3-dbffe959b91c"
2026-10-31 14:19:08 +01:00
```
`start` : claim valid and unconsumed, approver HUMAN at `aal2` and not the
executor, executor equals admission executor, now inside `window` .
`execute-step` : claim consumed once by this executor inside the window; step
id/operation/target/mode/scope match the digested `plan.steps` and lie inside
`scope_ceiling` ; `max_concurrent` respected. Fixtures from
`net-kingdom/examples/bounded-execution-admission/bind-rotation-svc-authelia.yaml`
including out-of-ceiling, wrong executor, expired window, replayed consume and
missing assurance. Gate: pack validates, all fixtures pass, the existing
`apply` gap test stays as characterisation.
## 6. Live gate readiness
```task
id: FLEX-WP-0040-T06
status: wait
priority: low
depends_on: [FLEX-WP-0040-T05, FLEX-WP-0039-T01]
2026-10-31 14:44:55 +01:00
state_hub_task_id: "f62be506-96d0-50fd-9874-b2a4df6f1dc8"
2026-10-31 14:19:08 +01:00
```
Wait: FLEX-WP-0039 readiness surface and a founder rollout decision for a pin
serving the pack, with the executor's declared fail-closed stance. Gate:
founder-approved rollout; no live change from this repo's agents.
2026-10-31 15:31:28 +01:00
2026-11-01 00:40:35 +01:00
## 7. Review policy v14: present-existing requester for founder approval
```task
id: FLEX-WP-0040-T07
status: done
priority: high
2026-11-01 04:02:34 +01:00
state_hub_task_id: "77c43b54-e3dd-5dbb-a295-79361030fa2c"
2026-11-01 00:40:35 +01:00
```
informed-decision INFD-WP-0010 (`present_existing` , commit 0e66a33) lets the
executor's own approval be presented to the founder; v13 refuses it with
`requester_mismatch` . Compact-sitting v14 (`proposed` ,
`sha256:8911458f36f1a60598aa19592a2d752a74dffe2617fd86238407ac87bc300fde` ,
`examples/informed-decision-present-existing-review/` ) keeps every v13 decision
and admits requester `service:nk-bind-executor` only from submitter
`nk-bind-executor` , memo class and approval action `bounded-execution` , a human
reviewer at KeyCape aal2, and never the approval actor itself (gate-house
GH-DEC-2026-026, class C2). Owner note: `docs/compact-sitting-v14-present-existing.md` .
Gate met: 46 embedded tests and the Go pin/evaluation tests pass; v13 untouched.
Live use waits on informed-decision carrying `approval_action` and a founder
release (image, values, consumer pin); no deployment from this task.
2026-10-31 15:31:28 +01:00
## Founder decision 2026-10-31
Approved by the founder (`proposed` -> `ready` ) after the NK-WP-0056-T02 owner answers (hub decision 19afd15e). The T06 pilot runs without the gate and records it as `not-evaluated` ; a second admission needs this gate or a founder-recorded exception.