Record approved hourly runtime rollout and native verification
Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a13eab-1e6a-7b33-9c37-372e90ada3a2
This commit is contained in:
parent
9c4b1d7285
commit
1ae0fe337a
8 changed files with 312 additions and 6 deletions
|
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"at": "2026-10-15T18:54:13.416550+00:00",
|
||||
"integrity": "ok",
|
||||
"schema_version": 5,
|
||||
"table_counts": {
|
||||
"approvals": 54,
|
||||
"entries": 47,
|
||||
"outbox": 90
|
||||
},
|
||||
"sha256": "c338e008865c59d2b583a7236c531450dc4eaa0bf97681bc33b7d438b9867cf4",
|
||||
"local_copy": "/tmp/nk-wp-0035-approval-backup/pre-frame.sqlite",
|
||||
"local_mode": "0o600",
|
||||
"persistent_path": "/data/nk-wp-0035-pre-frame-20261015.sqlite",
|
||||
"owner_engine_isolated_backup_verify": {
|
||||
"expected_schema_version": 5,
|
||||
"foreign_key_violations": 0,
|
||||
"integrity": [
|
||||
"ok"
|
||||
],
|
||||
"ok": true,
|
||||
"persistent": true,
|
||||
"required_tables": {
|
||||
"approvals": true,
|
||||
"entries": true,
|
||||
"outbox": true
|
||||
},
|
||||
"schema_current": true,
|
||||
"schema_version": 5
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
{
|
||||
"storage": {
|
||||
"schema_version": 5,
|
||||
"expected_schema_version": 5,
|
||||
"schema_current": true,
|
||||
"persistent": true,
|
||||
"required_tables": {
|
||||
"approvals": true,
|
||||
"entries": true,
|
||||
"outbox": true
|
||||
},
|
||||
"integrity": [
|
||||
"ok"
|
||||
],
|
||||
"foreign_key_violations": 0,
|
||||
"ok": true
|
||||
},
|
||||
"outbox": {
|
||||
"total": 91,
|
||||
"pending": 0,
|
||||
"max_age_seconds": 0,
|
||||
"attempts": 101,
|
||||
"failed_pending": 0,
|
||||
"counts": {
|
||||
"issuance": 47,
|
||||
"use": 11,
|
||||
"supersession": 0,
|
||||
"revocation": 0,
|
||||
"heartbeat": 33
|
||||
}
|
||||
},
|
||||
"table_counts": {
|
||||
"approvals": 54,
|
||||
"entries": 47,
|
||||
"outbox": 91
|
||||
},
|
||||
"recent_heartbeat_rows": [
|
||||
{
|
||||
"created_at": "2026-10-15T18:54:55+00:00",
|
||||
"drained_at": "2026-10-15T18:54:55+00:00",
|
||||
"attempts": 1
|
||||
},
|
||||
{
|
||||
"created_at": "2026-10-14T23:03:46+00:00",
|
||||
"drained_at": "2026-10-14T23:03:46+00:00",
|
||||
"attempts": 1
|
||||
}
|
||||
],
|
||||
"readiness": 200,
|
||||
"anonymous_refusal": 401,
|
||||
"at": "2026-10-15T18:55:27.962077+00:00",
|
||||
"pod_uid": "423398d8-9705-4ab5-8b2d-aaa4f590d3a1",
|
||||
"image": "forgejo.coulomb.social/coulomb/approval-engine@sha256:251941a5cb2724b57cc32cff6b693b1ab0be695bee4f56f02d51961189c0fa49",
|
||||
"heartbeat_seconds": 3600,
|
||||
"frame_digest": "d15e092387f128ffdfd00b9815707a05ff77c5bb0ba4d9a428fbc37b8c440b67",
|
||||
"ready": true
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"workplan": "NK-WP-0035",
|
||||
"status": "source-verified; operational acceptance pending",
|
||||
"status": "hourly runtime bindings deployed and verified; operational observer acceptance pending",
|
||||
"profile_status": "proposed",
|
||||
"live_observer_proved": false,
|
||||
"source_files": {
|
||||
|
|
@ -51,9 +51,9 @@
|
|||
"source_requested_bound_seconds": 7200,
|
||||
"receiver_grace_factor": 1.5,
|
||||
"live_steps": [
|
||||
"Verify generated one-hour frame bindings, current runtime/source pins and separately approved rollout scope",
|
||||
"Complete: founder approved timing-only rollout; Approval Engine backup/restart and Qonto candidate/promotion verified on unchanged images",
|
||||
"Review exact protected-registry metadata-only patch preserving credentials and all unrelated entries",
|
||||
"Founder approves exact runtime change; use governed owner custody with contained session and CAS/readback",
|
||||
"Obtain separate approval for exact registry metadata change; use governed owner custody with contained session and CAS/readback",
|
||||
"Receiver reload under owner change gate; prove actual per-class registration and class-isolated heartbeats",
|
||||
"Emit/drain actual lifecycle transitions under owner-scoped authority; correlate occurrence, acknowledgment and receiver acceptance windows including lag and duplicates",
|
||||
"Independent readback/count comparison and missing-class/lag findings; retain value-safe receipts"
|
||||
|
|
@ -80,7 +80,7 @@
|
|||
"observer_acceptance": "KG-WP-0005-T03 then QONTO-WP-0006-T03",
|
||||
"historical_receipt_limit": "Source-path capture with startup and deny; not independent collector/feed acceptance",
|
||||
"source_interval_seconds": 3600,
|
||||
"runtime_status": "source settings prepared; not deployed in this session"
|
||||
"runtime_status": "rapp-qonto-00010 promoted to 100 percent after candidate health, denial and source-count checks; periodic-hour and independent collector observation pending"
|
||||
},
|
||||
"local_identity": {
|
||||
"status": "explicit incompatibility retained",
|
||||
|
|
@ -126,5 +126,15 @@
|
|||
"registered_wait_frames": 2,
|
||||
"effective_deadline_frames": 3,
|
||||
"decision_id": "1ac5a70f-082e-4d8f-9ac8-59e4c175da02"
|
||||
},
|
||||
"runtime_rollout": {
|
||||
"approval": "Explicit founder reply: i approve, following timing-only rollout proposal",
|
||||
"approval_engine_receipt": "approval-engine-frame-rollout.json",
|
||||
"backup_receipt": "approval-engine-frame-backup.json",
|
||||
"qonto_candidate_receipt": "rapp-qonto-frame-candidate.json",
|
||||
"qonto_rollout_receipt": "rapp-qonto-frame-rollout.json",
|
||||
"receiver_registry_changed": false,
|
||||
"registered_2f_and_effective_3f_live": false,
|
||||
"periodic_hour_observed": false
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,78 @@
|
|||
{
|
||||
"candidate_revision": "rapp-qonto-00010",
|
||||
"baseline_revision": "rapp-qonto-00009",
|
||||
"image": "forgejo.coulomb.social/coulomb/rapp-qonto@sha256:2e42b5e665a19ffa3b3ae8109a8aab64f5485329f72810be063263ff5086cb3f",
|
||||
"heartbeat_seconds": 3600,
|
||||
"pod_uid": "3576cdd4-06a9-4641-856d-7ff690bb4dea",
|
||||
"health": {
|
||||
"status": "ok",
|
||||
"service": "qonto-assistant",
|
||||
"version": "0.1.0",
|
||||
"policy_file": "/usr/local/lib/python3.12/site-packages/qonto_assistant/policy/qonto-v1.yaml"
|
||||
},
|
||||
"before": {
|
||||
"stream_id": "qonto-assistant.audit",
|
||||
"stream_instance_id": "fc354245-9cc0-4849-8f6e-cfdf3d69c2fc",
|
||||
"instance_started_at": "2026-10-15T18:54:38+00:00",
|
||||
"snapshot_at": "2026-10-15T18:54:56+00:00",
|
||||
"last_stream_sequence": 1,
|
||||
"last_heartbeat_at": "2026-10-15T18:54:39+00:00",
|
||||
"source_transition_counts": {
|
||||
"audit.allow": 0,
|
||||
"audit.deny": 0
|
||||
},
|
||||
"since_last_heartbeat_counts": {
|
||||
"audit.allow": 0,
|
||||
"audit.deny": 0
|
||||
}
|
||||
},
|
||||
"after": {
|
||||
"stream_id": "qonto-assistant.audit",
|
||||
"stream_instance_id": "fc354245-9cc0-4849-8f6e-cfdf3d69c2fc",
|
||||
"instance_started_at": "2026-10-15T18:54:38+00:00",
|
||||
"snapshot_at": "2026-10-15T18:54:56+00:00",
|
||||
"last_stream_sequence": 2,
|
||||
"last_heartbeat_at": "2026-10-15T18:54:39+00:00",
|
||||
"source_transition_counts": {
|
||||
"audit.allow": 0,
|
||||
"audit.deny": 1
|
||||
},
|
||||
"since_last_heartbeat_counts": {
|
||||
"audit.allow": 0,
|
||||
"audit.deny": 1
|
||||
}
|
||||
},
|
||||
"deny_status": 403,
|
||||
"events": [
|
||||
{
|
||||
"stream_id": "qonto-assistant.audit",
|
||||
"stream_instance_id": "fc354245-9cc0-4849-8f6e-cfdf3d69c2fc",
|
||||
"stream_sequence": 1,
|
||||
"event_class": "audit.heartbeat",
|
||||
"reason": "startup",
|
||||
"timestamp": "2026-10-15T18:54:39+00:00",
|
||||
"source_transition_counts": {
|
||||
"audit.allow": 0,
|
||||
"audit.deny": 0
|
||||
},
|
||||
"window_transition_counts": {
|
||||
"audit.allow": 0,
|
||||
"audit.deny": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"stream_id": "qonto-assistant.audit",
|
||||
"stream_instance_id": "fc354245-9cc0-4849-8f6e-cfdf3d69c2fc",
|
||||
"stream_sequence": 2,
|
||||
"event_class": "audit.deny",
|
||||
"timestamp": "2026-10-15T18:54:56+00:00",
|
||||
"qonto_http_status": null,
|
||||
"deny_reason": "authz_denied",
|
||||
"decision": "deny",
|
||||
"request_id": "ff67b156-1672-4afe-b1c0-f846c3aa5e85"
|
||||
}
|
||||
],
|
||||
"source_counts_match_direct_capture": true,
|
||||
"qonto_call_by_deny_probe": false,
|
||||
"observation_boundary": "Direct Kubernetes logs and source snapshots; independent collector and periodic-hour observation not established."
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
[
|
||||
{
|
||||
"op": "test",
|
||||
"path": "/metadata/uid",
|
||||
"value": "a665e1d0-3ada-4b27-ac56-a8d452499003"
|
||||
},
|
||||
{
|
||||
"op": "test",
|
||||
"path": "/metadata/resourceVersion",
|
||||
"value": "75772109"
|
||||
},
|
||||
{
|
||||
"op": "replace",
|
||||
"path": "/spec/traffic",
|
||||
"value": [
|
||||
{
|
||||
"revisionName": "rapp-qonto-00010",
|
||||
"percent": 100
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
{
|
||||
"captured_at": "2026-10-15T18:56:02.381691+00:00",
|
||||
"baseline_revision": "rapp-qonto-00009",
|
||||
"promoted_revision": "rapp-qonto-00010",
|
||||
"traffic": [
|
||||
{
|
||||
"latestRevision": false,
|
||||
"percent": 100,
|
||||
"revisionName": "rapp-qonto-00010"
|
||||
}
|
||||
],
|
||||
"ready": true,
|
||||
"main_health": {
|
||||
"status": "ok",
|
||||
"service": "qonto-assistant",
|
||||
"version": "0.1.0",
|
||||
"policy_file": "/usr/local/lib/python3.12/site-packages/qonto_assistant/policy/qonto-v1.yaml"
|
||||
},
|
||||
"before": {
|
||||
"stream_id": "qonto-assistant.audit",
|
||||
"stream_instance_id": "fc354245-9cc0-4849-8f6e-cfdf3d69c2fc",
|
||||
"instance_started_at": "2026-10-15T18:54:38+00:00",
|
||||
"snapshot_at": "2026-10-15T18:55:49+00:00",
|
||||
"last_stream_sequence": 2,
|
||||
"last_heartbeat_at": "2026-10-15T18:54:39+00:00",
|
||||
"source_transition_counts": {
|
||||
"audit.allow": 0,
|
||||
"audit.deny": 1
|
||||
},
|
||||
"since_last_heartbeat_counts": {
|
||||
"audit.allow": 0,
|
||||
"audit.deny": 1
|
||||
}
|
||||
},
|
||||
"after": {
|
||||
"stream_id": "qonto-assistant.audit",
|
||||
"stream_instance_id": "fc354245-9cc0-4849-8f6e-cfdf3d69c2fc",
|
||||
"instance_started_at": "2026-10-15T18:54:38+00:00",
|
||||
"snapshot_at": "2026-10-15T18:55:50+00:00",
|
||||
"last_stream_sequence": 3,
|
||||
"last_heartbeat_at": "2026-10-15T18:54:39+00:00",
|
||||
"source_transition_counts": {
|
||||
"audit.allow": 0,
|
||||
"audit.deny": 2
|
||||
},
|
||||
"since_last_heartbeat_counts": {
|
||||
"audit.allow": 0,
|
||||
"audit.deny": 2
|
||||
}
|
||||
},
|
||||
"deny_status": 403,
|
||||
"candidate_evidence": "rapp-qonto-frame-candidate.json",
|
||||
"qonto_call_by_probe": false,
|
||||
"heartbeat_seconds": 3600,
|
||||
"independent_collector_acceptance": false,
|
||||
"hourly_periodic_observation": false
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"captured_at": "2026-10-15T18:56:40.337038+00:00",
|
||||
"cluster_uid": "a553c742-0115-43d4-99a4-a5ca56fe0786",
|
||||
"explicit_user_approval": "i approve",
|
||||
"scope": "Prepared hourly timing rollout, verified backup and controlled Approval Engine restart; Qonto zero-traffic candidate verification followed by promotion",
|
||||
"scope_checks": [
|
||||
{
|
||||
"resource": "approval-engine",
|
||||
"only_authorized_timing_annotation_and_qonto_traffic_changed": true
|
||||
},
|
||||
{
|
||||
"resource": "rapp-qonto",
|
||||
"only_authorized_timing_annotation_and_qonto_traffic_changed": true
|
||||
}
|
||||
],
|
||||
"receiver_registry_mutated": false,
|
||||
"secrets_read_or_rotated": false,
|
||||
"temporary_probe_pods_deleted": true
|
||||
}
|
||||
|
|
@ -90,7 +90,7 @@ Python compilation and `git diff --check` pass.
|
|||
id: NK-WP-0035-T04
|
||||
status: wait
|
||||
blocked_on: message-from:approval-engine
|
||||
blocking_reason: "Founder chose configurable frame f=1h: source heartbeat f, receiver wait 2f, effective deadline 3f. Generated source/runtime bindings await approved deployment and registry admission plus actual lifecycle reconciliation. Qonto still needs an actual rapp-qonto collector and AUDIT-WP-0013-T05 sender admission before KG-WP-0005-T03 observation. Existing bearer-revocation proof is delivered; local-identity incompatibility remains explicit."
|
||||
blocking_reason: "Founder chose configurable frame f=1h: source heartbeat f, receiver wait 2f, effective deadline 3f. Hourly runtime bindings are deployed and verified after explicit founder approval. Receiver registry admission and actual lifecycle reconciliation remain pending. Qonto still needs an actual rapp-qonto collector and AUDIT-WP-0013-T05 sender admission before KG-WP-0005-T03 observation. Existing bearer-revocation proof is delivered; local-identity incompatibility remains explicit."
|
||||
priority: high
|
||||
state_hub_task_id: "e3fbc8b8-00d5-57ce-ba0c-19b58044c950"
|
||||
```
|
||||
|
|
@ -318,6 +318,39 @@ frame-digest annotations. [Frame validation](../docs/evidence/2026-10-15-cadence
|
|||
|
||||
The earlier 48h/72h question is resolved by the explicit configurable-frame
|
||||
decision. No further deadline selection is waiting on the founder. T04 still
|
||||
requires actual approved rollout/registration, missing Qonto collector/admission,
|
||||
requires receiver registration, missing Qonto collector/admission,
|
||||
and operational lifecycle/observer acceptance. The profile remains proposed;
|
||||
this workplan is now **5/6 source tasks done**, with T04's operational gate open.
|
||||
|
||||
|
||||
## Approved hourly runtime rollout — 2026-10-15
|
||||
|
||||
Founder explicitly approved the prepared timing-only rollout. Cluster UID and
|
||||
resource UID/resourceVersion guards matched the reviewed preflight. Both
|
||||
immutable images, identity/secret references and resource/scaling limits were
|
||||
preserved. No receiver registry, credential or bank API operation was performed.
|
||||
|
||||
Approval Engine's online backup passed integrity and isolated owner-engine
|
||||
verification, with an independent mode-0600 local copy retained outside Git.
|
||||
The sole pod was replaced under its OnDelete strategy. New pod
|
||||
`423398d8-9705-4ab5-8b2d-aaa4f590d3a1` is Ready with heartbeat 3600s;
|
||||
schema v5 integrity and approval/entry counts are preserved. Readiness returns
|
||||
200, anonymous observation is refused with 401, and the new heartbeat drained
|
||||
with zero pending outbox rows. [Backup](../docs/evidence/2026-10-15-cadence-adoption/approval-engine-frame-backup.json)
|
||||
and [runtime receipt](../docs/evidence/2026-10-15-cadence-adoption/approval-engine-frame-rollout.json).
|
||||
|
||||
Qonto candidate `rapp-qonto-00010` carried the hourly setting while all traffic
|
||||
stayed pinned to `rapp-qonto-00009`. Startup heartbeat, health, an intentionally
|
||||
denied request (403 without a Qonto call), and same-instance source counts
|
||||
versus direct log capture passed. Candidate was then promoted to 100 percent;
|
||||
the main route passed health and the same denial/count checks. Temporary
|
||||
probe pods were removed. [Candidate](../docs/evidence/2026-10-15-cadence-adoption/rapp-qonto-frame-candidate.json)
|
||||
and [promoted runtime](../docs/evidence/2026-10-15-cadence-adoption/rapp-qonto-frame-rollout.json).
|
||||
|
||||
These are runtime setting and immediate delivery receipts, not an elapsed-hour
|
||||
periodic observation or independent collector acceptance. Qonto retains its
|
||||
existing scale-to-zero setting. Receiver registration of 2f=7200s / effective
|
||||
3f=10800s is still proposed, not deployed. Actual collector/sender admission,
|
||||
lifecycle reconciliation and independent silence/lag findings remain T04;
|
||||
local-identity's explicit incompatibility remains. Profile stays proposed and
|
||||
the workplan stays 5/6 done.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue