diff --git a/WORK-RECORDS.md b/WORK-RECORDS.md index 38f60df..c2153e5 100644 --- a/WORK-RECORDS.md +++ b/WORK-RECORDS.md @@ -39,7 +39,7 @@ | workplan | RPF-WP-0056 | blocked | — | workplans/RPF-WP-0056-playwright-consumer-admission.md | | workplan | RPF-WP-0057 | finished | — | workplans/RPF-WP-0057-sign-in-diagnosis-caller-proof.md | | workplan | RPF-WP-0058 | finished | — | workplans/RPF-WP-0058-reuse-private-source-reader.md | -| workplan | RPF-WP-0059 | active | — | workplans/RPF-WP-0059-hourly-cadence-receiver-custody.md | +| workplan | RPF-WP-0059 | finished | — | workplans/RPF-WP-0059-hourly-cadence-receiver-custody.md | | workplan | RPF-WP-0060 | blocked | — | workplans/RPF-WP-0060-browser-case-platform-bindings.md | | workplan | RPF-WP-0061 | active | — | workplans/RPF-WP-0061-self-service-ccr-intake.md | | workplan | RPF-WP-0062 | finished | — | workplans/RPF-WP-0062-custodian-agent-observer-identity.md | @@ -191,7 +191,7 @@ | task | RPF-WP-0059-T01 | done | — | workplans/RPF-WP-0059-hourly-cadence-receiver-custody.md | | task | RPF-WP-0059-T02 | done | — | workplans/RPF-WP-0059-hourly-cadence-receiver-custody.md | | task | RPF-WP-0059-T03 | done | — | workplans/RPF-WP-0059-hourly-cadence-receiver-custody.md | -| task | RPF-WP-0059-T04 | wait | — | workplans/RPF-WP-0059-hourly-cadence-receiver-custody.md | +| task | RPF-WP-0059-T04 | done | — | workplans/RPF-WP-0059-hourly-cadence-receiver-custody.md | | task | RPF-WP-0060-T01 | wait | — | workplans/RPF-WP-0060-browser-case-platform-bindings.md | | task | RPF-WP-0060-T02 | done | — | workplans/RPF-WP-0060-browser-case-platform-bindings.md | | task | RPF-WP-0060-T03 | wait | — | workplans/RPF-WP-0060-browser-case-platform-bindings.md | diff --git a/docs/evidence/2026-11-03-qonto-independent-readback/qonto-independent-readback.json b/docs/evidence/2026-11-03-qonto-independent-readback/qonto-independent-readback.json new file mode 100644 index 0000000..41e2522 --- /dev/null +++ b/docs/evidence/2026-11-03-qonto-independent-readback/qonto-independent-readback.json @@ -0,0 +1,91 @@ +{ + "schema_version": "platform.independent-cadence-readback/v1", + "status": "independent_custody_readback_complete", + "credential_values_emitted": false, + "observed_at": "2026-11-03T21:00:14.822896+00:00", + "receiver": { + "image": "forgejo.coulomb.social/coulomb/audit-core@sha256:304cfb83daa873e5790a2f262f6c4ccd56498b6e9e1a390368dcf0d407256300", + "deployment_uid": "b85fe3d0-75c9-4e0d-8c34-c6f1df0881bb", + "deployment_resource_version": "84752659", + "pod_uid": "61709182-dfd1-455f-9049-f3a2d49a8211", + "capabilities": { + "load_bearing": true, + "redact": true, + "write_only": true, + "source_exact": true, + "tenant_exact": true + }, + "synthetic_probe_only": true, + "credential_reads": 0, + "cadence_instance_capabilities": { + "cadence_registration": true, + "sqlite_instance_filter": true, + "postgres_instance_filter": true, + "synthetic_cadence_parse": true, + "synthetic_heartbeat_parse": true, + "synthetic_exact_scope": true + } + }, + "reader_name": "operator", + "registry_version": 18, + "reconciliation": { + "source": "qonto-assistant", + "tenant": "tenant:friendly:binky", + "since": "2026-10-15T19:36:00+00:00", + "until": "2026-11-03T21:00:04+00:00", + "counts": [ + { + "class": "audit-core.heartbeat", + "count": 2 + }, + { + "class": "audit.deny", + "count": 1 + } + ], + "stream_instance_id": "b351fa6b-e0d6-4f88-b7c9-6bacb1a112b7", + "basis": "independent_reader", + "means": "the count of events audit-core accepted and stored in this window. Divergence from the source's own count is a finding for the source; agreement proves neither completeness nor that any event occurred." + }, + "stream_findings": [ + { + "kind": "missing_heartbeat", + "sender": "rapp-qonto-collector", + "source": "qonto-assistant", + "class": "audit.deny", + "expected_within_seconds": 7200, + "last_seen": "2026-10-15T20:36:30+00:00", + "overdue_seconds": 1632236 + } + ], + "events": [ + { + "event_id": "28dad6de11fb25fe6e0e145351f047360d6898afb53afd4cd677e560ec69132a", + "source": "qonto-assistant", + "tenant": "tenant:friendly:binky", + "stream_instance_id": "b351fa6b-e0d6-4f88-b7c9-6bacb1a112b7", + "stream_sequence": 1, + "type": "audit-core.heartbeat", + "accepted_at": "2026-10-15T19:36:30+00:00", + "observed_at": "2026-10-15T19:36:17+00:00", + "covered_event_classes": [ + "audit.deny" + ], + "independent_custody_readback": true + }, + { + "event_id": "6a9f34445e13062e38ab309a6fc800dc9a2fa24cb8a46ecd919ae18fe9409874", + "source": "qonto-assistant", + "tenant": "tenant:friendly:binky", + "stream_instance_id": "b351fa6b-e0d6-4f88-b7c9-6bacb1a112b7", + "stream_sequence": 2, + "type": "audit.deny", + "accepted_at": "2026-10-15T19:36:30+00:00", + "observed_at": "2026-10-15T19:36:17+00:00", + "covered_event_classes": [], + "independent_custody_readback": true + } + ], + "scope": "bounded same-instance accepted custody; source-global findings require active-instance interpretation", + "helper_sha256": "9c25e901ffb34df87227ad074c7f73e9cd2e9fecf18ab49f886151b8d11d992f" +} diff --git a/workplans/RPF-WP-0059-hourly-cadence-receiver-custody.md b/workplans/RPF-WP-0059-hourly-cadence-receiver-custody.md index 573c9d0..14d5c79 100644 --- a/workplans/RPF-WP-0059-hourly-cadence-receiver-custody.md +++ b/workplans/RPF-WP-0059-hourly-cadence-receiver-custody.md @@ -4,7 +4,7 @@ type: workplan title: "Admit hourly receiver cadence and exact Qonto collector custody" domain: financials repo: railiance-platform -status: active +status: finished owner: codex topic_slug: railiance-platform created: "2026-10-15" @@ -64,9 +64,8 @@ resume on interruption. No live effect or secret read occurred in preparation. ```task id: RPF-WP-0059-T04 -status: wait +status: done priority: high -blocking_reason: "Independent reconciliation needs an audit-core release containing d46e89e (AUDIT-WP-0013-T06); the deployed b479801b refuses independent readers with source_not_allowed. Founder-run release: AUDIT-WP-0013-T07." state_hub_task_id: "7d8e5315-9470-5596-a865-d451284f6f50" ``` @@ -119,3 +118,33 @@ Git in `~/cadence-readback/`. Rerun the same command after AUDIT-WP-0013-T07. A new receiver release will also move the reviewed image pin in `scripts/audit-core-recovery-preflight.py` (RAILIANCE-WP-0024 owner contract) again, so the next attended recovery window needs a fresh owner round. + +### Independent readback captured; collector silent — 2026-11-03 + +After AUDIT-WP-0013-T07 released receiver `sha256:304cfb83…` (built from +audit-core `8185893`, which contains `d46e89e`), the founder reran the +readback, and it completed (`independent_custody_readback_complete`; reader +`operator`, basis `independent_reader`, no credential emitted). + +Results for instance `b351fa6b…`, window 2026-10-15T19:36Z to +2026-11-03T21:00Z: +- Reconciliation counts only 2 `audit-core.heartbeat` and 1 `audit.deny`. +- The source-global stream finding is `missing_heartbeat` for sender + `rapp-qonto-collector`, class `audit.deny`, last seen + 2026-10-15T20:36:30Z, overdue by 1,632,236 s (about 18.9 days). +- The exact-id reads of sequence 1 and 2 match source, tenant, instance and + sequence. + +The collector heartbeated once after the first hour and then stopped. No +collector instance has emitted for this source since. This is the observer +finding the evidence exists to produce, and it belongs to the Qonto runtime +owner. Platform custody, the receiver and the finding surface worked. Receipt: +`docs/evidence/2026-11-03-qonto-independent-readback/qonto-independent-readback.json` +(sha256 `959a1112…555a`). + +By founder decision, Platform's T04 part (coordination and the independent +capture) is done and RPF-WP-0059 is finished. Operational acceptance and the +silence finding are handed to King's Guard (KG-WP-0005-T03), Qonto +(QONTO-WP-0006-T03) and the runtime owner (rapp-qonto). Profile acceptance is +not claimed: the evidence is negative until the collector is restored and +re-observed.