diff --git a/docs/evidence/2026-10-15-cadence-adoption/receiver-readback-20261023.json b/docs/evidence/2026-10-15-cadence-adoption/receiver-readback-20261023.json new file mode 100644 index 0000000..8e958b4 --- /dev/null +++ b/docs/evidence/2026-10-15-cadence-adoption/receiver-readback-20261023.json @@ -0,0 +1,32 @@ +{ + "captured_counts": { + "audit.deny": 1, + "audit.heartbeat": 2 + }, + "event_presence": { + "28dad6de11fb25fe6e0e145351f047360d6898afb53afd4cd677e560ec69132a": true, + "6a9f34445e13062e38ab309a6fc800dc9a2fa24cb8a46ecd919ae18fe9409874": true, + "dfa71caeddb9633af2719fb9596a8ffb308f722cd12b385f18473116e6c4dc39": true + }, + "findings": [ + "reconciliation returned 403: source_not_allowed" + ], + "means": "agreement proves neither completeness nor King's Guard acceptance", + "payloads_retained": false, + "receiver_counts": {}, + "request": { + "event_ids": [ + "28dad6de11fb25fe6e0e145351f047360d6898afb53afd4cd677e560ec69132a", + "6a9f34445e13062e38ab309a6fc800dc9a2fa24cb8a46ecd919ae18fe9409874", + "dfa71caeddb9633af2719fb9596a8ffb308f722cd12b385f18473116e6c4dc39" + ], + "since": "2026-10-15T19:36:16+00:00", + "source": "qonto-assistant", + "stream_instance_id": "b351fa6b-e0d6-4f88-b7c9-6bacb1a112b7", + "tenant": "tenant:friendly:binky", + "until": "2026-10-15T20:37:23+00:00" + }, + "schema": "nk-wp-0035-receiver-readback/v1", + "token_retained": false, + "verdict": "diverge" +} diff --git a/workplans/NK-WP-0035-emission-cadence-security-profile.md b/workplans/NK-WP-0035-emission-cadence-security-profile.md index bbcca7d..7795d71 100644 --- a/workplans/NK-WP-0035-emission-cadence-security-profile.md +++ b/workplans/NK-WP-0035-emission-cadence-security-profile.md @@ -90,7 +90,7 @@ Python compilation and `git diff --check` pass. id: NK-WP-0035-T04 status: wait priority: high -blocking_reason: "Elapsed-hour capture done 2026-10-15 (3 events, receiver readback captured). Waiting on an independent receiver readback under a fresh attended operator OIDC login, then King's Guard acceptance (KG-WP-0005-T03, wait) and QONTO-WP-0006-T03." +blocking_reason: "Elapsed-hour capture done 2026-10-15 (3 events, receiver readback captured). Readback run 2026-10-23: presence 3/3, counts refused 403 source_not_allowed (operator reader scoped to user-engine); waiting on audit-core's cross-source count path and a rerun, then King's Guard acceptance (KG-WP-0005-T03, wait) and QONTO-WP-0006-T03." state_hub_task_id: "e3fbc8b8-00d5-57ce-ba0c-19b58044c950" ``` @@ -442,6 +442,19 @@ token. A class-name mapping difference between source and receiver shows up as port-forward. The receipt then goes to King's Guard (KG-WP-0005-T03) and qonto-assistant (QONTO-WP-0006-T03). +2026-10-23: the readback was run attended by the founder (fresh KeyCape OIDC/MFA login to OpenBao, +role platform-admin, through port-forward; token in a 0600 temp file, deleted afterwards, OpenBao +session revoked). [Receipt](../docs/evidence/2026-10-15-cadence-adoption/receiver-readback-20261023.json): +verdict `diverge` with one finding, `reconciliation returned 403: source_not_allowed`. +Event presence is 3/3, with source and tenant matching. Counts were not obtained: audit-core +`/v1/reconciliation` admits only an identity's own sources (`permits_source`), and the +operator reader is registered for `user-engine`. This is an authorization-scope result, not a +data mismatch. audit-core's own routing comment ("cross-source counts stay behind +may_read") reads the other way, so the question went to audit-core: either permit cross-source +counts for a full-scope may_read reader, or name the sanctioned independent counting path. +Rerun the same helper once that is answered. The receipt still goes to King's Guard as +presence-only evidence. T04 stays wait. + ## Automate staged receiver derivation without sibling mutations ```task