diff --git a/workplans/NK-WP-0040-execution-attribution-receipt.md b/workplans/NK-WP-0040-execution-attribution-receipt.md index e91cc9c..3e954f1 100644 --- a/workplans/NK-WP-0040-execution-attribution-receipt.md +++ b/workplans/NK-WP-0040-execution-attribution-receipt.md @@ -60,8 +60,8 @@ schema, and validator are explicitly left to T02. ```task id: NK-WP-0040-T02 status: wait -blocked_on: message-from:railiance-infra -blocking_reason: "railiance-platform (RPF-WP-0067-T01, bd8ca57) has no playbook runner; the runner owner (railiance-infra for S1 Ansible) must name the emitter and its audit-core sender before schema/validator work." +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" ``` @@ -89,6 +89,24 @@ token), `executing_workload` (workload binding only proposed), `artifact_digest` 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