net-kingdom/workplans/NK-WP-0040-execution-attribution-receipt.md
tegwick 5466c831cd
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
NK-WP-0040-T02: railiance-infra names the S1 converge wrapper as emitter (babae80)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 308701@bnt-lap001
Assistant-Session: 5548e447-444c-4dcc-bed1-05c16eebfe56
2026-10-28 09:58:04 +01:00

142 lines
7.5 KiB
Markdown

---
id: NK-WP-0040
type: workplan
title: "Define an execution-attribution receipt for Railiance runs"
domain: infotech
repo: net-kingdom
status: active
flavor: residual
owner: claude-code
topic_slug: netkingdom
created: "2026-09-23"
updated: "2026-10-10"
related: [RCLK-WP-0002]
state_hub_workstream_id: "e2533f3a-aa43-59b3-bff3-8e64b6149487"
---
Raised by the railiance-clock identity review
(`history/2026-09-23-railiance-clock-identity-and-layer-review.md`, Ruling 1).
IAM Profile v0.3 defines who acts: human, service and agent principals, and
delegation. Playbook Capability Contract v0.1 defines what is selected and who
is responsible. No NetKingdom contract defines the record that ties **one
execution** to its actor chain, artifact and result.
## Draft the receipt fields as a Playbook Capability Contract amendment
```task
id: NK-WP-0040-T01
status: done
priority: medium
state_hub_task_id: "9d02685a-a3d9-5b9f-b09e-aef1f196a97f"
```
Draft a v0.2 amendment that adds an execution-attribution receipt with these
fields:
- issuer and subject of the initiating actor
- delegation reference (`actor_sub`/`act.sub`) when present
- executing workload binding and runtime principal
- tenant and environment
- run ID
- source commit and artifact digest
- target inventory reference and action
- decision and approval IDs
- attributed time interval, with its clock source and bound when one exists
The receipt must never embed bearer credentials. Unknown attribution is kept
explicit, not inferred. Start from the field list in railiance-clock's review.
**Done 2026-09-27.** Drafted as
`canon/standards/playbook-capability-contract_v0.2.md` (status `proposed`,
supersedes v0.1, which stays `accepted` and normative until this is
accepted). It adds an "Execution Attribution Receipt (proposed)" section
with every field above, explicit non-goals (no fourth IAM principal type,
not a decision record, not a substitute for responsibility claims), and the
never-embed-credentials / no-inferred-attribution rules. Emission, custody,
schema, and validator are explicitly left to T02.
## Agree the evidence holder and schema with audit-core and Railiance
```task
id: NK-WP-0040-T02
status: wait
blocked_on: founder-decision
blocking_reason: "Emitter, holder and wire binding agreed (RAIL-HO-WP-0015-T01, RPF-WP-0067-T01, AUDIT-WP-0014-T01). Open: founder decision on how an operator-run process gets the audit-core sender bearer; NetKingdom schema/validator with delegation unknown and S1 meanings for tenant/environment/artifact_digest."
priority: medium
state_hub_task_id: "963120c1-7c72-5806-942b-6f49e4c66e54"
```
audit-core holds evidence (layer model §3.3, Evidence role). Railiance
executes and emits. Agree who emits, who holds and how the receipt is
validated. Add a schema under `canon/schemas/` and a validator beside the
existing playbook-capability tooling.
**Waiting 2026-09-27.** Routed to audit-core (evidence-holder/schema
agreement) and Railiance (emitter confirmation) via State Hub messages
`48eb1101-a577-40c0-bbaa-39df02198155` and
`4f1c67bc-8de2-483f-bcac-dbdf107ce95a`. NetKingdom adds the schema and
validator once both reply; nothing here can be finished unilaterally
without pre-empting their agreement.
**2026-10-28:** railiance-platform answered from source (RPF-WP-0067-T01, `bd8ca57`): it runs no
playbooks, so it is not the emitter; the contract's reference declaration is railiance-infra's
S1 Ansible `bootstrap-host`. Wire binding to reuse: `POST /v1/events` to audit-core with an
`Idempotency-Key` equal to the envelope id, `correlation_id` = run id, a per-sender bearer from
`platform/workloads/audit-core/senders` delivered by ESO, envelope `source` = sender name, no
per-message signature. Recommended emission: every terminal outcome keyed by `run_id`. Not
truthfully fillable today: `initiator.iss/sub` and `delegation` (shell-started runs carry no
token), `executing_workload` (workload binding only proposed), `artifact_digest` (Ansible has
no packaged artifact), `decision_refs`, `time_interval.bound`. Next: railiance-infra names the
runner and emitter; a sender credential then goes to railiance-platform as a change request.
**2026-10-28 (railiance-infra):** answered from source (RAIL-HO-WP-0015-T01, `babae80`). No S1
runner exists: the operator runs `ansible-playbook` through `make converge` (`Makefile:361-362`)
with no callback or wrapper. Decided: the emitter is a new railiance-infra converge wrapper
modelled on `scripts/s1_handoff.py` (RAIL-HO-WP-0015-T02, not built): UUID4 `run_id` first,
emission from a `finally` path for succeeded/failed/refused/interrupted, local retention and
retry with `run_id` as Idempotency-Key. Proposed audit-core sender: `railiance-infra-s1-runner`.
Fillable today: `run_id`, `target`, `action`, `time_interval.start/end`, `source_commit` (only
with a clean-tree refusal); partly `runtime_principal` (OS accounts) and `clock_source`; not
`initiator`, `delegation`, `executing_workload`, `tenant`, `environment`, `artifact_digest`,
`decision_refs`, `time_interval.bound`.
Remaining for T02: (1) founder decision: how an operator-run shell process obtains the sender
bearer (the ESO-projected Secret reaches pods only), e.g. a short-lived OpenBao fetch or an
in-cluster relay; then railiance-platform registers the sender. (2) NetKingdom: the receipt
schema allows an explicit `unknown` for `delegation` (the draft permits absence only when there
was no delegation) and defines `tenant`, `environment` and `artifact_digest` for an Ansible S1
run; then schema under `canon/schemas/` and validator. railiance-infra's wrapper waits on both.
## Infrastructure review — 2026-09-28
Use accepted IAM Profile v0.3 and Playbook Capability Contract v0.1 as the
current baseline. Proposed IAM v0.4 and Playbook v0.2 are not deployed
capabilities. RCLK-WP-0002 still explicitly names this receipt as its dependency
on September 28. T02 remains `wait` for emitter and evidence-holder agreement.
Require the agreed schema to preserve unknown actor/delegation and clock
bounds explicitly, correlate decision/approval/run/artifact identities, and
distinguish durable receipt ingestion from attribution proof. Reuse audit-core
sender custody and reconciliation contracts rather than create another audit
sink. Acceptance needs an actual Railiance-emitted receipt and audit-core
readback, plus invalid/missing attribution cases; schema validation alone
cannot establish end-to-end attribution.
Evidence and cross-plan priorities: [estate review](../history/2026-09-28-open-workplan-infrastructure-review.md).
2026-10-10 consolidation review: AUDIT-WP-0014-T01 (October 4) accepts
audit-core evidence custody and publishes field/unknown/absence/envelope
requirements in audit-core/docs/cross-repo-evidence-admission.md. The custody
reply is delivered; a stranded message-from:audit-core qualifier is obsolete.
Railiance emitter agreement is still required: retain original request
4f1c67bc-8de2-483f-bcac-dbdf107ce95a and identify the exact component/source,
run-id/idempotency, tenant/scope and wire binding with the Railiance owner.
T02 remains wait. Its existing both-owner agreement gate still governs schema
implementation; draft preparation is not owner acceptance. AUDIT-WP-0014-T02
consumes the eventual canonical schema/fixtures and emitter binding, and cannot
be used as evidence that either has already arrived.
> 2026-10-11: demoted to `flavor: residual` / `backlog` by founder-authorized triage — off the
> critical path (identity → authz → secrets → SecurityCase execution). Tasks are unchanged;
> promote back when demand or risk appears. See the-custodian
> `history/20261011-netkingdom-security-progress-assessment.md`.