AUDIT-WP-0018: answer NK-WP-0056-T02 — hold bounded-executor receipts, propose event mapping
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: 994874@bnt-lap001
Assistant-Session: 6017c416-d619-47eb-bd1a-f670a02d7d87
This commit is contained in:
tegwick 2026-10-31 14:19:10 +01:00
parent d46e89ee21
commit 1ef939b38a
4 changed files with 258 additions and 0 deletions

View file

@ -0,0 +1,85 @@
---
id: AUDIT-WP-0018
type: workplan
title: "Hold bounded-executor execution-attribution receipts"
domain: infotech
repo: audit-core
status: proposed
flavor: implementation
owner: audit-core
topic_slug: audit-evidence-dependencies
created: "2026-10-31"
updated: "2026-10-31"
related:
- NK-WP-0056
- NK-WP-0040
- AUDIT-WP-0014
---
# AUDIT-WP-0018 — Hold bounded-executor execution-attribution receipts
NetKingdom's Bounded Execution Admission v0.1 makes a non-human executor
(`service:nk-bind-executor`, namespace `sso`) emit one execution-attribution
receipt per run. Audit-core holds those receipts. The owner answer and the event
mapping are in `docs/bounded-executor-receipts.md`. Canonical schema validation
is still AUDIT-WP-0014-T02 and is not duplicated here.
## Answer the NK-WP-0056-T02 owner request
```task
id: AUDIT-WP-0018-T01
status: done
priority: high
```
Hub message 755cbeed-ecbd-46d9-883e-958fbd88378b. Audit-core accepts custody.
Each run produces one receipt event that carries the per-step outcomes, check
results, `reverted` and `budget`. Each run also produces an
`execution.run.started` event, correlated with the receipt by `run_id`. Event
ids are deterministic from `run_id`. The proposed `secret_policy` is `reject`.
NetKingdom has to decide how a singular `target`/`action` relates to per-step
targets and actions, and has to make `decision_refs` typed.
## Prepare sender registration and ingress for the executor
```task
id: AUDIT-WP-0018-T02
status: wait
priority: high
blocking_reason: "NetKingdom must confirm source, event types, tenant binding and the started event; the rapp-* package must name pod labels and ServiceAccount; railiance-platform must route the ESO-projected bearer."
blocked_on: message-from:net-kingdom
```
Prepare the following:
- a non-secret registry entry (`nk-bounded-executor`: exact source, exact
tenants, write only, `secret_policy: reject`, and either `evidence_kind`
`load-bearing` or `attributive` with a `completeness_trade`);
- a NetworkPolicy that admits only the executor's pods in `sso`.
Then test on synthetic fixtures:
- accept on 202;
- a retry returns a 200 duplicate;
- a reused `run_id` with a different body is a 409 conflict;
- wrong source or tenant is refused;
- a secret-shaped step check is refused with 400.
The live registry seed and the rollout are founder-run.
## Detect runs that started without a receipt
```task
id: AUDIT-WP-0018-T03
status: wait
priority: medium
blocking_reason: "Depends on NetKingdom adopting the execution.run.started event and stating the admission window bound after which a missing receipt is a finding."
blocked_on: message-from:net-kingdom
```
Report every `execution.run.started` that has no
`execution.attribution.receipt` with the same `correlation_id` after the
declared window. Reuse the existing stream-completeness/cadence surface
(`docs/stream-completeness.md`, `docs/cadence-registration.md`) instead of
adding a new monitor. The report is a finding for the verifier and the
founder. Audit-core does not infer what the run did.