From e3a17cd83dab458d70b43f0a948aaca3f2fb5fe6 Mon Sep 17 00:00:00 2001 From: BobbyAxerol Date: Tue, 20 Oct 2026 03:07:28 +0000 Subject: [PATCH 1/9] v2.2.5: window result, compose parity cpus tolerance, certificate PASS under P1, release notes - scripts/kn_versioned_compose.py parity: compare cpus within 1e-6 vCPU (compose passes cpus through float32: 2.25 -> NanoCpus 2249999872); tests in test_kn_stable_compose. R2 re-run read-only against live 2026-10-20T03:00:55Z: PASS, 863 checks, 0 problems. - Window 2026-10-20 receipts (non-secret byte copies + SHA256SUMS) under upgrade/evidence/releases/v2.2.5/window-20261020T0128Z. - Drafts moved to final files; packet section 10 records the window result. - CERTIFICATE.md / certificate.json / endpoint-report.json: status PASS under P1 (POST_HOC_PACKAGING_DECISION, owner confirmation required): the predeclared G5 item "concurrent hot-read latency" was not measured; gates_without_p1 keeps G5 NOT_MEASURED. Other gates inherited from v2.2.4 with delta proofs; SDK 2.4.1 wheel unchanged. - CERTIFICATION_LEDGER.md and the plan journal updated. --- CERTIFICATION_LEDGER.md | 42 +++ DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md | 46 +++ scripts/kn_mesh_rotation_rehearsal.py | 2 +- scripts/kn_versioned_compose.py | 18 +- scripts/kn_window_writer.py | 2 +- tests/test_kn_stable_compose.py | 55 +++- .../evidence/releases/v2.2.5/CERTIFICATE.md | 166 ++++++++++ .../v2.2.5/{drafts => }/CERTIFICATE_SCOPE.md | 6 +- .../{drafts => }/MAINTENANCE_WINDOW_PACKET.md | 44 ++- .../evidence/releases/v2.2.5/RELEASE_NOTES.md | 67 ++++ .../v2.2.5/{drafts => }/W12_DECISION.md | 2 +- .../{drafts => }/W12_DECISION_EVIDENCE.json | 0 .../evidence/releases/v2.2.5/certificate.json | 298 ++++++++++++++++++ .../releases/v2.2.5/drafts/RELEASE_NOTES.md | 38 --- .../releases/v2.2.5/endpoint-report.json | 227 +++++++++++++ .../window-20261020T0128Z/.gitattributes | 2 + .../v2.2.5/window-20261020T0128Z/SHA256SUMS | 19 ++ .../releases/v2.2.5/window-20261020T0128Z/T_S | 1 + .../v2.2.5/window-20261020T0128Z/T_W1 | 1 + .../baseline-writer.json | 1 + .../v2.2.5/window-20261020T0128Z/decision.txt | 2 + .../v2.2.5/window-20261020T0128Z/k6-post.json | 79 +++++ .../v2.2.5/window-20261020T0128Z/k6-pre.json | 79 +++++ .../window-20261020T0128Z/pre-parity.json | 1 + .../window-20261020T0128Z/query-mem-w12.txt | 36 +++ .../v2.2.5/window-20261020T0128Z/r1.json | 1 + .../v2.2.5/window-20261020T0128Z/r2-note.json | 7 + .../r2-parity-rerun.json | 1 + .../window-20261020T0128Z/r2-parity.json | 1 + .../window-20261020T0128Z/r4-soak.jsonl | 60 ++++ .../v2.2.5/window-20261020T0128Z/r4-soak.out | 59 ++++ .../window-20261020T0128Z/tls-perms.out | 1 + .../window-20261020T0128Z/tls-verify.json | 160 ++++++++++ .../window-20261020T0128Z/tls-verify.out | 1 + .../window-20261020T0128Z/w12a-ready.json | 1 + .../window-20261020T0128Z/w12b-ready.json | 1 + 36 files changed, 1477 insertions(+), 50 deletions(-) create mode 100644 upgrade/evidence/releases/v2.2.5/CERTIFICATE.md rename upgrade/evidence/releases/v2.2.5/{drafts => }/CERTIFICATE_SCOPE.md (96%) rename upgrade/evidence/releases/v2.2.5/{drafts => }/MAINTENANCE_WINDOW_PACKET.md (91%) create mode 100644 upgrade/evidence/releases/v2.2.5/RELEASE_NOTES.md rename upgrade/evidence/releases/v2.2.5/{drafts => }/W12_DECISION.md (98%) rename upgrade/evidence/releases/v2.2.5/{drafts => }/W12_DECISION_EVIDENCE.json (100%) create mode 100644 upgrade/evidence/releases/v2.2.5/certificate.json delete mode 100644 upgrade/evidence/releases/v2.2.5/drafts/RELEASE_NOTES.md create mode 100644 upgrade/evidence/releases/v2.2.5/endpoint-report.json create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/.gitattributes create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/SHA256SUMS create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/T_S create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/T_W1 create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/baseline-writer.json create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/decision.txt create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/k6-post.json create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/k6-pre.json create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/pre-parity.json create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/query-mem-w12.txt create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r1.json create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-note.json create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-parity-rerun.json create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-parity.json create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r4-soak.jsonl create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r4-soak.out create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-perms.out create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-verify.json create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-verify.out create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12a-ready.json create mode 100644 upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12b-ready.json diff --git a/CERTIFICATION_LEDGER.md b/CERTIFICATION_LEDGER.md index 11cd9dc7..76f2e984 100644 --- a/CERTIFICATION_LEDGER.md +++ b/CERTIFICATION_LEDGER.md @@ -2363,3 +2363,45 @@ Pinned at: `certificate.json` status PASS, `amendments` = G4-A1, G4-A2, A3 (refreshed), A4 v2 (pre-registered, not needed), A5 (`post_hoc: true`); `gates_without_a5` G11 FAIL. It supersedes the 2026-10-18 certificate (`da2fd484...`). `release.yml` is unchanged. No tag, no merge. + +## DL v2.2.5 - 2026-10-20 production window + certificate (PASS under post-hoc P1; owner confirmation pending) + +Compact release on top of v2.2.4: IDR-127 configuration, versioned KN compose + healthchecks, mesh mTLS generation +`20261019T084200Z`, Query image with the IDR-129 fix. Rust digests unchanged; TS writer unchanged (W12-A). Evidence: +`upgrade/evidence/releases/v2.2.5/` (CERTIFICATE.md, certificate.json, endpoint-report.json, RELEASE_NOTES.md, +MAINTENANCE_WINDOW_PACKET.md section 10, window receipts `window-20261020T0128Z/` with `SHA256SUMS`). + +### 2026-10-20 - maintenance window (production, coordinator-run, owner GO): R1 R2 R4 PASS, W14 deferred + +Pinned at: +- Query `qdl-v2-python:2.2.5-9b6747f` `sha256:753604f8abaa866e2de30c7ccaf36168986bc6991550ee326d53e51b83d1550a` + (query_kn_1/2); every other DL role on its v2.2.4 digest (rust `27c79b53` / `60f83a51` / `7c848aad`, Kafka + `9516fb76`, Redis `dfa18828`, bar edge rc14 `08f356a8` held); +- compose `deploy/compose/qdl-v2-stable-kn.yml` `50c1f014...` + `qdl-v2-stable-kn.v2.2.5.env` `c6770d5d...`; +- TLS generation `20261019T084200Z` (CA `610c0c6f...`, notAfter 2027-10-19); writer `2deb90b0` with the new identity, + STRICT. + +- Outage 545 s (writer stop 01:31:04Z -> STRICT READY 64/64 01:40:09Z, incl. ~2 min coordinator wait-loop bug); + execution-ready 53 = baseline; K6 no-op (topics equal); Query max 188.3 MiB during both writer starts. +- R1 PASS (`r1.json` `eb47296d...`): 17 roles healthy, RestartCount 0, trust anchor moved (old identity refused by + Query rc 60 / Stream num=20), Kafka 3 brokers, URP 0, core 3 members. +- R2: window run FAIL only on kafka1-3 `cpus` (compose float32: 2249999872 vs 2.25); tool fixed (1e-6 vCPU tolerance, + `tests.test_kn_stable_compose` 12 OK, negative control fails on the old code); re-run read-only 03:00:55Z **PASS**, + 863 checks, 0 problems (`r2-parity-rerun.json` `15415306...`). +- R4 60-min passive soak PASS (`r4-soak.jsonl` `82a4e9aa...`): READY 59/59, 0 auth/protocol, 0 restarts, Query + plateau 260-277 MiB; QUOTE p95 <=25 ms n=7261, TRADE p95 <=25 ms n=1800 (writer native_probe); served age + NOT_MEASURED. Portal running, Codex read-only: a regression sample, not a certification of the IDR-128 envelope. +- W14 monitor DEFERRED (GHCR read:packages missing). +- Re-run only if a pinned digest, the compose/env, the TLS generation or the writer image changes. + +### 2026-10-20 - v2.2.5 certificate: status PASS under P1 (POST_HOC_PACKAGING_DECISION); not tagged + +- Inherited from v2.2.4 (`certificate.json` `42412548...`, counted run 040311Z): G1-G4, G7-G10, G12-G14; G11 as in + v2.2.4 (PASS under A5, FAIL without). G6 PASS by delta proof (no eligibility code in the IDR-129 diff; execution-ready + 53 = baseline). +- G5: the predeclared delta item "concurrent hot-read latency" (CERTIFICATE_SCOPE.md D3 (b)) was **not measured**. + P1 splits G5 by code path (hot path unchanged + maintenance hook ran 0 times in production; warmup path PASS by the + IDR-129 A/B) and records hot reads during a maintenance run (136-160 ms loop block, <= 1 per 120 s, only >= 448 MiB) + as NOT_MEASURED. `gates_without_p1` G5 NOT_MEASURED. **Owner confirmation of P1 is required before the tag**; the + alternative is the isolated hot-read A/B. +- SDK 2.4.1 wheel `9f79e032...` (same as v2.2.4, rebuilt byte-identical). `release.yml` unchanged. No tag. diff --git a/DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md b/DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md index 9acdc16b..bf74e645 100644 --- a/DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md +++ b/DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md @@ -77035,3 +77035,49 @@ locally; release image NOT rebuilt (the coordinator rebuilds rust together with tuning campaign) in `CERTIFICATE_SCOPE.md` section 3b and the new `drafts/RELEASE_NOTES.md`. - Status: the window is ready for go once this PR is merged (CI green); production-ready only after the window's R1-R4. Next: coordinator schedules the window per packet section 9. + +### DL v2.2.5: window result, R2 parity tolerance fix, certificate and release packaging - 2026-10-20 (Claude) + +- Coordinator 2026-10-20: package v2.2.5 after the production maintenance window (coordinator-run, owner GO, + 2026-10-20 01:28-02:54:45Z, forward path, no rollback). Branch `docs/v225-release-package` from origin/dev aa89d83 + (worktree `/home/bobby/.worktrees/data-layer-dev`). Production read-only in this slice (docker inspect/logs/stats, + one compose-parity run); no host lock taken (none needed: docs, a unit test, a read-only parity check). +- Window facts (receipts copied, non-secret only, to `upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/`, 19 + files, `SHA256SUMS`; each file grepped for keys/passwords/tokens: none; `rollback/` and `writer/*.compose.json` + not copied): outage 545 s (writer stop 01:31:04Z -> STRICT READY 64/64 01:40:09Z, incl. ~2 min coordinator + wait-loop bug at W10); Query READY with the new TS identity 01:33:03Z, old identity refused; K6 topics pre == post; + Query max 188.3 MiB during both writer starts; R1 PASS; R4 60-min passive soak PASS; W14 DEFERRED (GHCR + read:packages missing); portal running, Codex read-only. +- R2 fix: `scripts/kn_versioned_compose.py` `parity` compared `cpus` exactly; compose passes `cpus: 2.25` through + float32 to NanoCpus 2249999872, so kafka1-3 failed with 1.3e-7 vCPU. New `CPUS_TOLERANCE = 1e-6` + `cpus_equal`, + `same(..., equal=...)` for that field only. Tests: `tests/test_kn_stable_compose.py` new class + `KnComposeParityCpusTest` (parity() against a faked docker inspect: float32 cap PASS; 2.24/2.26/2.0 vs 2.25 FAIL + with exactly one problem; tolerance bounds). `python3 -B -m unittest tests.test_kn_stable_compose`: 12 OK. Negative + control: the float32 test FAILS against `git show HEAD:scripts/kn_versioned_compose.py`. Re-run read-only against + live 2026-10-20T03:00:55Z with the v2.2.5 env + new generation + kn-secrets: **PASS, 863 checks, 0 problems, 6 + intended deltas** (`r2-parity-rerun.json` `15415306...`). +- SDK: `scripts/build_qdl_sdk_release.py` rebuilt into the scratchpad: wheel `9f79e032...`, `.cdx.json`, `.release.json` + byte-identical to v2.2.4 (`git diff b5ab3c2 -- qdl_sdk generated contracts scripts/build_qdl_sdk_release.py` + empty), so `release.yml`'s wheel check holds with the v2.2.4 sha. +- Certificate (`upgrade/evidence/releases/v2.2.5/CERTIFICATE.md`, `certificate.json`, `endpoint-report.json`): + status **PASS under P1 (POST_HOC_PACKAGING_DECISION, owner confirmation required before the tag)**. Finding (E2): + the predeclared G5 delta item D3 (b) "concurrent hot-read latency" was never measured (the IDR-129 harness drives + warmups only; arm H `H.out` `643dcc60...`). P1 splits G5: hot path INHERITED (request path unchanged by the + IDR-129 diff; the maintenance hook ran 0 times in production since the window: `docker logs --since + 2026-10-20T01:33:00Z` grep `kind=memory_maintenance` 0/0, RSS 228/234 MiB), warmup path PASS by the A/B (RSS + 361-445 vs 472-743 MiB, warmup p50 6.6-8.3 vs 6.4-8.7 s, 429 991-1118 vs 992-1135 per burst), hot reads during a + maintenance run NOT_MEASURED (136-160 ms loop block per run, <= 1 per 120 s, only >= 448 MiB). Without P1: + `gates_without_p1` G5 NOT_MEASURED -> not PASS. Other gates: G1-G4, G7-G10, G12-G14 INHERITED from v2.2.4 + (certificate `42412548...`); G11 inherited with A5 (FAIL without); G6 PASS by delta proof (no eligibility code in + the diff, execution-ready 53 = baseline). +- Limits recorded: P1; IDR-128 supported load (envelope measured with heavy stacks paused; window ran with the portal + running); inherited G11/A5, G14, IDR-108; served age / delivery lag / end-to-end NOT_MEASURED passively; W14 + deferred (no watchdog); single host; old-identity containers (packet 5c) pending owner cleanup approval; R2 window + FAIL was a tool defect; R4 memory "first 10 min" wording not met literally (plateau 260-277 MiB from ~02:02Z). +- Files: drafts moved to `upgrade/evidence/releases/v2.2.5/` (CERTIFICATE_SCOPE.md, MAINTENANCE_WINDOW_PACKET.md + + section 10 window result, RELEASE_NOTES.md final, W12_DECISION.md/.json); docstring paths in + `scripts/kn_window_writer.py` and `scripts/kn_mesh_rotation_rehearsal.py`; CERTIFICATION_LEDGER.md v2.2.5 entry. +- Status: implemented and tested locally (tool fix); v2.2.5 runtime production-deployed, certificate PASS under P1, + NOT tagged. Open: owner confirmation of P1 (or the hot-read A/B under the host lock), W14 (TS read:packages token), + old-identity cleanup approval, PR CI. Next: PR into dev (coordinator merges), then the dev -> main release PR; + the coordinator creates the tag. diff --git a/scripts/kn_mesh_rotation_rehearsal.py b/scripts/kn_mesh_rotation_rehearsal.py index 0960d18c..ac0bcdab 100644 --- a/scripts/kn_mesh_rotation_rehearsal.py +++ b/scripts/kn_mesh_rotation_rehearsal.py @@ -2,7 +2,7 @@ """Isolated rehearsal of the v2.2.5 maintenance window: atomic mesh mTLS rotation + versioned-compose roll. Purpose - Run the window procedure of ``upgrade/evidence/releases/v2.2.5/drafts/MAINTENANCE_WINDOW_PACKET.md`` on a + Run the window procedure of ``upgrade/evidence/releases/v2.2.5/MAINTENANCE_WINDOW_PACKET.md`` on a disposable copy of the KN topology before production sees it, and measure it: A bring the mini-stack up from the committed compose (``deploy/compose/qdl-v2-stable-kn.yml``) on the OLD diff --git a/scripts/kn_versioned_compose.py b/scripts/kn_versioned_compose.py index 5417d4eb..98479e29 100644 --- a/scripts/kn_versioned_compose.py +++ b/scripts/kn_versioned_compose.py @@ -385,6 +385,17 @@ def image_id(ref: str) -> str: return json.loads(sh(["docker", "image", "inspect", ref]))[0]["Id"] +# docker compose hands ``cpus`` to the engine through a float32, so 2.25 arrives as NanoCpus 2249999872 +# (1.3e-7 vCPU short; DL v2.2.5 window R2, 2026-10-20). Any real cap change is >= 0.01 vCPU. +CPUS_TOLERANCE = 1e-6 + + +def cpus_equal(live_nano_cpus: int, compose_cpus) -> bool: + """True when the live NanoCpus and the compose ``cpus`` value are the same cap within CPUS_TOLERANCE.""" + + return abs(live_nano_cpus / 1e9 - float(compose_cpus or 0)) <= CPUS_TOLERANCE + + def parity(compose: Path, env_files: list[Path]) -> dict: cfg = compose_config(compose, env_files) problems, deltas, checked = [], [], 0 @@ -393,10 +404,10 @@ def parity(compose: Path, env_files: list[Path]) -> dict: live_env_clear = dict(e.split("=", 1) for e in json.loads(sh(["docker", "inspect", f"{PROJECT}-{role}-1"]))[0]["Config"]["Env"]) svc = cfg["services"][role] - def same(field, a, b): + def same(field, a, b, equal=None): nonlocal checked checked += 1 - if a != b: + if not (equal(a, b) if equal else a == b): problems.append(f"{role}.{field}: live={_short(a)} compose={_short(b)}") same("image", live["image_id"], image_id(svc["image"])) @@ -413,7 +424,8 @@ def same(field, a, b): svc.get("command")) same("user", live["user"] if live["user"] != live["image_user"] else None, svc.get("user")) h = live["host"] - same("cpus", h["NanoCpus"] / 1e9, float(svc.get("cpus", 0))) + same("cpus", h["NanoCpus"] / 1e9, float(svc.get("cpus", 0)), + equal=lambda _a, b: cpus_equal(h["NanoCpus"], b)) same("mem_limit", h["Memory"], int(svc.get("mem_limit", 0))) same("memswap_limit", h["MemorySwap"], int(svc.get("memswap_limit", 0))) same("read_only", bool(h["ReadonlyRootfs"]), bool(svc.get("read_only", False))) diff --git a/scripts/kn_window_writer.py b/scripts/kn_window_writer.py index 6b04fe06..20ad2613 100644 --- a/scripts/kn_window_writer.py +++ b/scripts/kn_window_writer.py @@ -2,7 +2,7 @@ """W12-A of the v2.2.5 window: TS writer composes for the TLS identity switch, readiness check, passive soak. Purpose - The v2.2.5 window (``upgrade/evidence/releases/v2.2.5/drafts/MAINTENANCE_WINDOW_PACKET.md`` W12) keeps the + The v2.2.5 window (``upgrade/evidence/releases/v2.2.5/MAINTENANCE_WINDOW_PACKET.md`` W12) keeps the production TS writer image (2deb90b0) and changes exactly one thing for good: the host source of its mesh TLS identity mount ``/run/secrets/qdl-v2`` moves to the new generation. Because the window outage exceeds the writer's 120 s execution-surface TTL, the writer first starts once with ``MARKET_DATA_NATIVE_REQUIRE_RESUME=0`` diff --git a/tests/test_kn_stable_compose.py b/tests/test_kn_stable_compose.py index 9122031e..cef26f54 100644 --- a/tests/test_kn_stable_compose.py +++ b/tests/test_kn_stable_compose.py @@ -3,14 +3,17 @@ Static checks only (no Docker): the 17 production roles, images by variable with every release env pinning a digest, the v2.2.4 env equal to the certified runtime images and caps, healthcheck/logging/restart on every role, loopback-only ports, the consumer aliases, external networks/volumes, TLS sources only from the generation -variables, and no secret literal in any committed file. Live parity is ``scripts/kn_versioned_compose.py parity``. +variables, and no secret literal in any committed file. Live parity is ``scripts/kn_versioned_compose.py parity``; +its field comparison (cpus tolerance) is proven here against a faked ``docker inspect``. """ from __future__ import annotations +import importlib.util import json from pathlib import Path import re import unittest +from unittest import mock import yaml @@ -141,5 +144,55 @@ def test_no_secret_literal_in_committed_files(self): self.assertTrue(str(value).startswith("${"), key) +SPEC = importlib.util.spec_from_file_location("kn_versioned_compose", ROOT / "scripts/kn_versioned_compose.py") +compose_tool = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(compose_tool) + + +class KnComposeParityCpusTest(unittest.TestCase): + """DL v2.2.5 window R2: compose ``cpus: 2.25`` reaches the engine as NanoCpus 2249999872 (float32).""" + + def run_parity(self, live_nano_cpus: int, compose_cpus) -> dict: + live = { + "image_id": "sha256:kafka", "image_env": {}, "entrypoint": None, "image_entrypoint": None, + "cmd": None, "image_cmd": None, "user": None, "image_user": None, "stop_timeout": 60, + "healthcheck": {"Test": ["CMD", "true"]}, "mounts": [], "networks": {}, + "host": {"NanoCpus": live_nano_cpus, "Memory": 0, "MemorySwap": 0, "ReadonlyRootfs": False, + "Init": False, "PidsLimit": None, "CapDrop": None, "SecurityOpt": None, "Tmpfs": None, + "RestartPolicy": {"Name": "unless-stopped"}, "PortBindings": None, + "LogConfig": {"Type": "json-file", "Config": {"max-size": "50m"}}}, + } + svc = {"image": "kafka@sha256:x", "cpus": compose_cpus, "restart": "unless-stopped", + "stop_grace_period": "60s", "healthcheck": {"test": ["CMD", "true"]}, + "logging": {"driver": "json-file", "options": {"max-size": "50m"}}} + inspect = json.dumps([{"Config": {"Env": []}}]) + with mock.patch.object(compose_tool, "ROLES", ("kafka1",)), \ + mock.patch.object(compose_tool, "compose_config", return_value={"services": {"kafka1": svc}}), \ + mock.patch.object(compose_tool, "inspect_role", return_value=live), \ + mock.patch.object(compose_tool, "image_id", return_value="sha256:kafka"), \ + mock.patch.object(compose_tool, "sh", return_value=inspect): + return compose_tool.parity(Path("compose.yml"), []) + + def test_float32_rounding_of_the_compose_cap_is_not_drift(self): + result = self.run_parity(2_249_999_872, 2.25) + self.assertEqual(result["verdict"], "PASS", result["problems"]) + self.assertEqual(result["problems"], []) + + def test_a_real_cap_difference_still_fails(self): + for live in (2_240_000_000, 2_260_000_000, 2_000_000_000): + with self.subTest(live=live): + result = self.run_parity(live, 2.25) + self.assertEqual(result["verdict"], "FAIL") + self.assertEqual(len(result["problems"]), 1) + self.assertTrue(result["problems"][0].startswith("kafka1.cpus: live="), result["problems"]) + + def test_tolerance_bounds(self): + self.assertTrue(compose_tool.cpus_equal(2_249_999_872, 2.25)) + self.assertTrue(compose_tool.cpus_equal(2_000_000_000, "2.0")) + self.assertTrue(compose_tool.cpus_equal(0, None)) + self.assertFalse(compose_tool.cpus_equal(2_249_998_000, 2.25)) # 2e-6 vCPU: beyond the 1e-6 tolerance + self.assertFalse(compose_tool.cpus_equal(1_000_000_000, None)) + + if __name__ == "__main__": unittest.main() diff --git a/upgrade/evidence/releases/v2.2.5/CERTIFICATE.md b/upgrade/evidence/releases/v2.2.5/CERTIFICATE.md new file mode 100644 index 00000000..0e84f44e --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/CERTIFICATE.md @@ -0,0 +1,166 @@ +# Quant Data Layer v2.2.5 - scoped release certificate + +Status: **PASS under P1 (POST_HOC_PACKAGING_DECISION, see section 4), which needs the owner's confirmation before the +tag.** Without P1, G5 is NOT_MEASURED under the item that `CERTIFICATE_SCOPE.md` fixed before the window, and the +certificate would not be PASS. Both readings are kept side by side (`certificate.json` `gates` / +`gates_without_p1`), as v2.2.4 did for A5. NOT TAGGED, NOT PUBLISHED. + +Issued 2026-10-20 after the production maintenance window of 2026-10-20 01:28-02:54Z (coordinator-run, owner GO). +v2.2.5 is a compact release: configuration, container definitions, mesh certificates, and the Query python image with +the IDR-129 fix. **No Rust binary changed.** Every image digest below was read with `docker inspect` / +`docker image inspect` (read-only, 2026-10-20 ~03:00Z). Every sha256 was computed with `sha256sum` or Python `hashlib`. +Machine form: [certificate.json](certificate.json) (schema `qdl.scoped-release-certificate.v2`). + +Companion files: [RELEASE_NOTES.md](RELEASE_NOTES.md), [endpoint-report.json](endpoint-report.json), +[CERTIFICATE_SCOPE.md](CERTIFICATE_SCOPE.md) (the per-gate matrix fixed before the window), +[MAINTENANCE_WINDOW_PACKET.md](MAINTENANCE_WINDOW_PACKET.md) (procedure and section 10 result), +[W12_DECISION.md](W12_DECISION.md), window receipts [window-20261020T0128Z/](window-20261020T0128Z/) (`SHA256SUMS`). + +## 1. Decision rule + +- Fixed before the window (`CERTIFICATE_SCOPE.md` sections 2-3): a gate whose measured source is unchanged is + inherited from v2.2.4 with its named delta proof; G5/G6 are never inherited (Query code changed, IDR-129) and rest + on delta proof D3 (a)-(d); "a missing item of (b) is NOT_MEASURED and blocks the G5 claim". R1, R2, R3 and R4 must + PASS. +- Carried from v2.2.4 section 1: no gate FAIL; a NOT_MEASURED item is never upgraded; required CI green on the PR head. +- `status` is `PASS` only when all hold. Section 4 shows that one predeclared item (D3 (b) concurrent hot-read latency) + is missing; PASS therefore rests on P1. That is a post-measurement change of how G5 is scoped, made at packaging, + and is labelled as such everywhere. + +## 2. Identity + +| Item | Value | Source | +| --- | --- | --- | +| Previous published release | `v2.2.4` (tag on main `b5ab3c2`) | git | +| Release head carrying this certificate | the packaging commit on `docs/v225-release-package` (SHA reported in the PR) | git | +| Query image (query_kn_1/2, **changed**) | `qdl-v2-python:2.2.5-9b6747f` `sha256:753604f8abaa866e2de30c7ccaf36168986bc6991550ee326d53e51b83d1550a`, label `9b6747fdcefbc3ebd9107776411db4ba9528d5e5`; build receipt PASS: 20 files differ from 3e9e4d3a = exactly `git diff 31a5155..9b6747f`, unexpected 0, pip freeze equal ([python-image-build-receipt.json](python-image-build-receipt.json) `2bacdc16...`) | `docker image inspect`, `sha256sum` | +| Rust images (**unchanged digests**) | ingestors x2, stream x2 `27c79b53...` (label `9dab224`); projectors x2 `60f83a51...` (`c7ce7d3`); rust_core x3 `7c848aad...` (`a4e7b3b`, rc22) | `docker image inspect` | +| Unchanged non-DL-built images | kafka1-3 `apache/kafka@sha256:9516fb76...`; market_cache, stable_redis `redis@sha256:dfa18828...`; binance_bar_edge `08f356a8...` (rc14 `a388537`, held, scoped out) | `docker inspect` | +| Container definitions | `deploy/compose/qdl-v2-stable-kn.yml` `50c1f014...` + `qdl-v2-stable-kn.v2.2.5.env` `c6770d5d...` (every image by digest) | `sha256sum` | +| Mesh TLS | generation `20261019T084200Z`, one CA `610c0c6f...` (notAfter 2027-10-19T08:42:01Z), every leaf notAfter 2027-10-19, same CN/SAN per identity; replaces `20260822T144323Z` (CA `7b374a30...`, notAfter 2026-11-20T14:43:23Z); `rotate_mesh_tls.py verify` 118/118 PASS on the day | `window-20261020T0128Z/tls-verify.json` `0a650aa5...` | +| TS writer (W12-A) | `market_data_service_p184w` `sha256:2deb90b0cc52eae7610fa44692f90df077e9db100ca259e38fd652a2dc1c5dc5` (TS `30f50a91`), unchanged; identity mount = new generation; JWT key and `DATA_LAYER_V2_JWT_MANIFEST_REVISION=11` unchanged; `MARKET_DATA_NATIVE_REQUIRE_RESUME=1` | `docker inspect` | +| SDK | `qdl-sdk 2.4.1`, wheel `9f79e032604bf79db5ca9070c7f8a99b242e7cf22e1659b395b307dc798c28e7` = v2.2.4; rebuilt 2026-10-20 from this branch: wheel, `.cdx.json` `6bda0014...`, `.release.json` `273e5326...` byte-identical; `git diff b5ab3c2 -- qdl_sdk generated contracts scripts/build_qdl_sdk_release.py` empty | `sha256sum`, `git diff` | + +### Runtime at issue (`docker inspect`, 2026-10-20 ~03:00Z) + +| Role | Image | Caps (vCPU / memory) | RestartCount | Health | Started | +| --- | --- | --- | --- | --- | --- | +| query_kn_1, _2 | `753604f8` | 2.0 / 2 GiB | 0, 0 | healthy | 01:32:45Z | +| ingestor_okx_swap, ingestor_binance_usdm | `27c79b53` | 1.0 / 0.75 | 0, 0 | healthy | 01:32:13Z | +| stream_kn_1, _2 | `27c79b53` | 0.75 | 0, 0 | healthy | 01:33:12Z | +| market_projector_1, _2 | `60f83a51` | 0.75 | 0, 0 | healthy | 01:32:14Z | +| rust_core, _2, _3 | `7c848aad` | 1.0 / 1.0 / 0.5 | 0, 0, 0 | healthy | 01:32:12Z | +| kafka1-3 | `9516fb76` | 2.25 (NanoCpus 2249999872) | 0, 0, 0 | healthy | 01:31:26Z | +| stable_redis | `dfa18828` | 0.5 | 0 | healthy | 01:31:26Z | +| market_cache | `dfa18828` | 1.0 | 0 | healthy | 2026-09-27 (never recreated) | +| binance_bar_edge | `08f356a8` (held) | 0.75 | 0 | healthy | 01:35:14Z | +| market_data_service_p184w (TS) | `2deb90b0` | - | 0 | (no healthcheck) | 01:38:32Z | +| monitor_service (TS) | `5cd22b4e`, **exited** (W14 deferred) | - | - | - | - | + +17 DL roles, none OOM-killed. 2 of them (query x2) run a v2.2.5 image; the other 15 keep their v2.2.4-certified +digests. + +## 3. Evidence index + +| Evidence | Path | sha256 | +| --- | --- | --- | +| Window receipts (non-secret copies) | [window-20261020T0128Z/](window-20261020T0128Z/) | `SHA256SUMS` lists all 19 files; r1 `eb47296d...`, r4-soak.jsonl `82a4e9aa...`, r4-soak.out `d4301a18...`, r2-parity-rerun `15415306...` | +| Pre-window compose parity | `window-20261020T0128Z/pre-parity.json` | `184e7a13...` (PASS, 847 checks) | +| R2 after the tool fix | `window-20261020T0128Z/r2-parity-rerun.json` | `15415306...` (PASS, 863 checks, 0 problems, 6 intended deltas) | +| IDR-129 isolated A/B arm A (3e9e4d3a) | `~/.local/state/qdl-v2/idr129-query-rss-20261019b/A-stage.out` | `d758dbff687a7446d5267bce4715014406fbbbc3f8609dfacf0315238a92c3e2` | +| IDR-129 isolated A/B arm H (84512ab built image) | `~/.local/state/qdl-v2/idr129-query-rss-20261019c/H.out` | `643dcc60d45a48dffbc4cc7bf6979a560315f12d8b794e2f227c208385faabbd` | +| Query build receipt (window image) | `~/.local/state/qdl-v2/build-v2.2.5-9b6747f/receipt.json` = [python-image-build-receipt.json](python-image-build-receipt.json) | `2bacdc168e07878cff6062b14f26ad4837b8aaca3200ef63e30c61e17406ae0e` | +| Final isolated rehearsal incl. burst | [rehearsal-final-20261019T175600Z.json](rehearsal-final-20261019T175600Z.json) | `410e0c37229e877a6019099b9b3f37322273667b45f7568f4033355eb10f6096` | +| First rehearsal | [rehearsal-20261019.json](rehearsal-20261019.json) | `9d6586dcd547d4822a062613991dcd9078e2806f45facb5cdf995641bff1a1b0` | +| IDR-127 semantic parity | [semantic-parity.json](semantic-parity.json) | `0d8e3a3bbc0096691b10cfc0a172779968f5dc68bdc7f301cc00492b536b4861` | +| Inherited certificate / endpoint report / scorecard | `../v2.2.4/certificate.json`, `endpoint-report.json`, `scorecard.json` | `42412548...`, `013b66e6...`, `2dc2f8d1...` | +| Inherited G12/G13 | `../v2.2.4/g12-g13-inheritance.json` | `95088c9c...` | +| Endpoint report | [endpoint-report.json](endpoint-report.json) | in certificate.json `endpoint_report_sha256` | + +## 4. Gates + +Inheritance holds only for the W12-A branch that was taken (writer unchanged) and K6 no-op (k6-post `topics` == +k6-pre). INHERITED = the v2.2.4 receipt of the counted run `p184-final-campaign-20261019T040311Z` (or the v2.2.4 +G12/G13 receipts), pinned by sha256 in `certificate.json` `inherited`. + +| Gate | v2.2.5 verdict | Basis | +| --- | --- | --- | +| G1-G3 transit | INHERITED PASS | rust binaries unchanged; regression R1 + R4 PASS; the Query-served parts are G5/G6 | +| G4 per-row delivery | INHERITED PASS | same; under G4-A1, G4-A2, A3 as in v2.2.4 | +| G5 request latency | **PASS under P1; NOT_MEASURED without P1** | below | +| G6 execution eligibility | PASS (delta proof) | D3 (a): the IDR-129 diff (`qdl/api_v2/router.py` warmup response slicing, `qdl/query/service.py` refused-item frame release + `large_warmup_lane_busy`, `qdl/runtime/memory_maintenance.py`, `qdl/runtime/stable.py` install) touches no eligibility, freshness or policy code; IDR-129 tests 12 OK on its PR; production execution-ready 53 after STRICT = pre-window baseline 53 (R4 range 48-53 over 59 samples, READY 64/64 in all) | +| G7-G10 integrity, lossless TRADE, cursor, ordering | INHERITED PASS | rehearsal offset/cursor continuity in every phase; R1 URP 0, under-min-ISR 0, core 3 members, projector lag back (277 / 56) | +| G11 recovery | INHERITED: PASS under A5, **FAIL without A5** (as v2.2.4) | not re-run; the window measured recovery: outage 545 s, STRICT READY 64/64 | +| G12 isolated fault | INHERITED PASS | binaries unchanged | +| G13 writer acceptance | INHERITED PASS (76/76 on 2deb90b0) | W12-A: same writer image; BOOTSTRAP -> STRICT READY 64/64 in the window | +| G14 CPU | INHERITED PASS | healthchecks only added cheap probes; no R4 CPU sample was recorded (predeclared as "not a gate") | + +**G5 in detail.** Predeclared delta proof D3 and what exists: + +| D3 item | Result | +| --- | --- | +| (a) IDR-129 tests incl. failed/cancelled requests; rows, limits, order unchanged | PASS (PR #46: `tests/test_query_idr129_memory.py` 12 OK, negative control fails on the unfixed service; affected suites 552 tests, 1 environment failure explained in the plan) | +| (b) isolated A/B on a production-volume private cache copy, 3e9e4d3a vs fixed image, 12 x 64-warmup bursts, no manual gc/trim in the scored arms | **RSS**: 472 -> 683 MiB (max 743.7) before vs 361 -> 445 MiB after (plateau). **Warmup latency** (200s, p50 per burst): 6.4-8.7 s vs 6.6-8.3 s. **429 per burst**: 992-1135 vs 991-1118. **Failed slices per burst** (harness at 1 vCPU, queue-dominated, both arms): 27-37 vs 26-35. **Concurrent hot-read latency: NOT_MEASURED** (the harness drives warmups only). Arm H ran image 84512ab; its four IDR-129 files equal the released 9b6747f (`git diff` empty) | +| (c) final rehearsal 64-warmup burst on the window configuration | PASS (3 bursts, baseline 133.4, peaks 160-172, settled 156.8 MiB; near-zero row volume) | +| (d) build receipt | PASS (above) | +| Window | Query max 188.3 MiB during both writer starts; R4 plateau 260-277 MiB, 0 restarts; R4 request latency QUOTE n=7261 p50 <=10 / p95 <=25 / p99 <=25 ms, TRADE n=1800 p50 <=25 / p95 <=25 / p99 <=50 ms (writer native_probe, basis `QUERY_REQUEST_START_TO_REDIS_APPLY_DECISION_MONOTONIC`; a different clock from the v2.2.4 G5 classes, so it is a regression sample, not a G5 re-measurement) | + +**P1 (POST_HOC_PACKAGING_DECISION, 2026-10-20, Claude; requires owner confirmation).** G5 is split by code path: +- G5-hot (the v2.2.4 stage-50 per-class p95/p99 of hot reads): the request path of hot reads is unchanged by the + IDR-129 diff (it changes warmup responses, refused batch items and adds a maintenance hook). The only new code + that can run on the event loop beside a hot read is the memory maintenance, which runs only when RSS >= 448 MiB + (`QDL_QUERY_MEMORY_SOFT_LIMIT_MIB`), the large-warmup lane is idle >= 3 s and >= 120 s passed since the last run. + In production after the window it ran **0 times** (`docker logs --since 2026-10-20T01:33:00Z` of query_kn_1/2, + grep `kind=memory_maintenance`, 0 and 0; RSS 228 / 234 MiB at 03:00Z). G5-hot is therefore INHERITED PASS. +- G5-cold (warmup shapes): PASS by D3 (b) RSS, latency and 429 rows above. +- G5-maintenance (hot-read latency while a maintenance run executes): **NOT_MEASURED**, stated as a limit. What is + measured: each run blocks the replica's event loop for 136-160 ms (arm H at 1 vCPU: gc 128-152 ms + trim 8-12 ms), + at most once per 120 s per replica. A hot read on that replica that overlaps a run waits up to that long. This is a + bound from measured durations, not a latency measurement under load. + +Without P1, the predeclared rule makes G5 NOT_MEASURED and the status not PASS. To remove P1: run the isolated +A/B with a concurrent hot-read driver (both images, under the host lock), or have the owner accept P1. + +## 5. Limits stated by this certificate + +1. **P1 is post hoc** (section 4): G5 is PASS only with the G5-maintenance item recorded as NOT_MEASURED. +2. **Supported load (IDR-128 OPEN, owner decision 2026-10-19 ~18:00Z).** The inherited latency envelope was measured + with unrelated heavy stacks paused (15 portal containers, Codex tree stopped); a mixed portal workload on the same + host is outside the certified scope. The window and the R4 soak ran with the portal **running** and Codex + read-only, passive load only; R4 numbers are a regression sample under that condition, not a re-certification. +3. Inherited from v2.2.4 and still true: G11 PASS only under the post-hoc A5 (FAIL without it); G14 DL mean CPU 5.75 + vCPU above the 5 vCPU budget (not a gate); IDR-108 open; G12 harness shape is not production shape; G13 cells are + shadow-certified; the writer vendors SDK 2.4.0. +4. Not measured passively in the window: served event age, delivery lag venue -> canonical, end-to-end venue -> TS + cache (inherited from v2.2.4 G5/G6, G4, G2). +5. **W14 deferred**: `monitor_service` stays exited (GHCR pull denied, the token lacks `read:packages`), so no + DATA_LAYER / cert-expiry / Query-memory watchdog runs. +6. Single host, not HA. +7. **Old-identity containers** (packet section 5c): `market_data_service`, `market_data_service_p184w-dr07-rollback`, + `market_data_service_p184w-r49-rollback` still mount the 2026-08-22 identity; they cannot join the rotated mesh; + removal waits for the owner's approval (rule 34). Test apparatus pinned to 2026-08-22 identities (e.g. + `scripts/idr129_query_rss_isolated.py` `IDENTITIES`) must be repointed before its next production-facing run. +8. bar edge held on rc14 (catalog r11 / acquisition r19 checkpoint); inactive client CAs in the consumer bundles + expire 2026-11-24 .. 2026-12-26 and are used by no running consumer (`CERTIFICATE_SCOPE.md` section 4). +9. The consumer-visible outage of the window was 545 s, including ~2 min of a coordinator wait-loop bug at W10. +10. R2 at the window FAILed on a tool defect (float32 `cpus`); the PASS is the re-run after the fix + (`CPUS_TOLERANCE` 1e-6 vCPU, unit tests in `tests/test_kn_stable_compose.py`). +11. R4 Query memory rose over the first 10 min (+30 MiB in 5 min) before its plateau; the packet's literal "first 10 + min not growing" wording is not met, the soak tool's last-10-min check is (packet section 10). + +## 6. Rollback + +Until 2026-11-20 14:43Z: the packet section 6 (old generation + v2.2.4 env, rehearsed twice: 267.8 s / 519.0 s). +After that date the old certificates are expired; an image-only rollback (v2.2.4 env, Query `3e9e4d3a`, with the new +generation env) is the remaining path and is **not rehearsed**. Writer: unchanged image; only its identity mount moves +with the generation. `QDL_QUERY_MEMORY_SOFT_LIMIT_MIB=0` disables the maintenance hook without an image change. + +Not touched by this release: rust images, Kafka data/topics/offsets/KRaft metadata, market_cache, JWT keys, cursor +keys, consumer realm dir r16, bar edge image and checkpoint, V1 rollback container. + +## 7. Publication (STOP before tagging) + +- `certificate.json` `status` is `PASS`; the endpoint report sha256 in it equals the file; RELEASE_NOTES.md exists; + the SDK wheel is the byte-identical 2.4.1 build. `release.yml` is unchanged. +- Still required before a tag: the owner's confirmation of P1 (or the hot-read A/B); required CI green on the PR + heads; the release head on `origin/main`. The coordinator creates the tag. diff --git a/upgrade/evidence/releases/v2.2.5/drafts/CERTIFICATE_SCOPE.md b/upgrade/evidence/releases/v2.2.5/CERTIFICATE_SCOPE.md similarity index 96% rename from upgrade/evidence/releases/v2.2.5/drafts/CERTIFICATE_SCOPE.md rename to upgrade/evidence/releases/v2.2.5/CERTIFICATE_SCOPE.md index 8b5596a7..fdeb6af0 100644 --- a/upgrade/evidence/releases/v2.2.5/drafts/CERTIFICATE_SCOPE.md +++ b/upgrade/evidence/releases/v2.2.5/CERTIFICATE_SCOPE.md @@ -1,4 +1,8 @@ -# Data Layer v2.2.5 certificate scope (DRAFT proposal for the owner) +# Data Layer v2.2.5 certificate scope + +Status: applied. This was the DRAFT proposal used for the window; the issued certificate is `CERTIFICATE.md` / +`certificate.json` (same folder), which records where the evidence met, or did not meet, each item below +(notably D3 (b) "concurrent hot-read latency": NOT_MEASURED, see `CERTIFICATE.md` section 4). v2.2.5 is a compact release (owner 2026-10-19 ~09:00Z: "phải gọn lại"; TS is the main work). It changes configuration, container definitions, the mesh certificates and the Query python image (IDR-127 configuration files diff --git a/upgrade/evidence/releases/v2.2.5/drafts/MAINTENANCE_WINDOW_PACKET.md b/upgrade/evidence/releases/v2.2.5/MAINTENANCE_WINDOW_PACKET.md similarity index 91% rename from upgrade/evidence/releases/v2.2.5/drafts/MAINTENANCE_WINDOW_PACKET.md rename to upgrade/evidence/releases/v2.2.5/MAINTENANCE_WINDOW_PACKET.md index 21f83eae..1c9a8f1e 100644 --- a/upgrade/evidence/releases/v2.2.5/drafts/MAINTENANCE_WINDOW_PACKET.md +++ b/upgrade/evidence/releases/v2.2.5/MAINTENANCE_WINDOW_PACKET.md @@ -1,8 +1,9 @@ -# Data Layer v2.2.5 maintenance window packet (DRAFT, not executed) +# Data Layer v2.2.5 maintenance window packet -Status: DRAFT for the owner's go/no-go. Nothing in this packet has been executed on production. The procedure was -rehearsed on an isolated stack (section 7); the final pre-window rehearsal with the window's exact inputs is item -2.5a. Target window: before 2026-11-06; hard deadline 2026-11-20 14:43Z (expiry of every deployed mesh certificate). +Status: **EXECUTED 2026-10-20 01:28-02:54Z on production (coordinator-run, owner GO), forward path, no rollback.** +Result: section 10; receipts `window-20261020T0128Z/` (this folder). The text below is the packet as approved +(it was the DRAFT for the go/no-go; only this status line and section 10 were added after the window). +Target window was before 2026-11-06; hard deadline 2026-11-20 14:43Z (expiry of the previous mesh generation). **This window is a full-mesh outage, not a config-only change.** The CA changes and every peer authenticates every other peer, so the TS writer, every Data Layer mesh role and the three brokers stop together; the Trading System @@ -425,3 +426,38 @@ per code/venue/symbol/feed. PASS = writer READY in every sample, 0 auth/protocol - [ ] TS DR equivalence "before" snapshot written (W0.5) before W1. - [ ] After acceptance: certificate scope per `CERTIFICATE_SCOPE.md` (same folder), then tag v2.2.5; old-identity cleanup (section 5c) as a separate owner approval. + +## 10. Window result (2026-10-20, executed) + +Coordinator-run with the owner's GO; window dir `~/.local/state/qdl-v2/releases/v2.2.5/window-20261020T0128Z`. +Non-secret receipts are copied byte-for-byte to `window-20261020T0128Z/` in this folder (`SHA256SUMS` there); +`rollback/` (env-only secrets, the old TLS tar) and `writer/*.compose.json` (env secrets) stay outside Git. + +| Step | Time (UTC) | Result | +|---|---|---| +| Pre-checks | 01:29-01:30Z | TLS verify 118/118 PASS, perms PASS, pre-parity PASS (847 checks), writer baseline READY 64/64 (execution-ready 53), K6 pre observed, DR "before" snapshot written; decision: Codex read-only (not paused), portal NOT paused, W14 deferred | +| W1 writer stop | 01:31:04Z (T_W1 marker 01:31:00Z) | clean stop | +| W2-W3 mesh stop | 01:31:17Z | all mesh roles exited | +| W4 brokers | 01:31:37Z answer; URP 0 at 01:31:50Z | 3 brokers | +| W5 K6 | 01:32:05Z | `topics` of k6-post == k6-pre (no-op) | +| W6-W8 cores, ingestors, projectors | healthy 01:32:24Z | 3 core members | +| W9 Query | READY over mTLS with the new TS identity 01:33:03Z; old identity refused (rc 60) | image 753604f8 | +| W10 Streams | verify OK with the new identity; old identity refused (verify error num=20) | includes ~2 min of a coordinator wait-loop bug (operator script, not a product fault) | +| W11 bar edge | healthy ~01:38Z | image unchanged | +| W12a BOOTSTRAP | READY 64/64 01:38:23Z | execution-ready 50 | +| W12b STRICT | T_S 01:38:31Z; READY 64/64 01:40:09Z, `MARKET_DATA_NATIVE_REQUIRE_RESUME=1` | execution-ready 53 (= baseline) | +| Consumer-visible outage | **545 s** (01:31:04Z -> 01:40:09Z) | inside the 10 min planning budget and the 25 min rollback deadline | +| Query memory during W12 | max 188.3 MiB (limit for a hold: 1.8 GiB) | `query-mem-w12.txt` | +| R1 | PASS | 17 roles healthy, RestartCount 0, images = v2.2.5 env, writer 0 auth/protocol lines since T_S (files and stdout), Kafka 3 brokers, URP 0, under-min-ISR 0, core 3 members, served/mounted certificates notAfter 2027-10-19 | +| R2 | tool FAIL at 01:41Z on kafka1-3 `cpus` only (live 2.249999872 vs compose 2.25: compose passes `cpus` through float32); tool fixed (`CPUS_TOLERANCE` 1e-6 vCPU, unit tests) and re-run read-only 2026-10-20T03:00Z: **PASS, 863 checks, 0 problems, 6 intended deltas** (`r2-parity-rerun.json`) | | +| R3 | build receipt PASS (20 files = git diff, unexpected 0, pip freeze equal) + IDR-129 delta proof | `CERTIFICATE.md` | +| R4 60-min passive soak | 01:41:23-02:41Z: PASS | writer READY 59/59, execution-ready 48-53, 0 auth/protocol, 0 data-policy lines in writer logs, 0 restarts; Query 183-188 MiB at start, plateau 260-277 MiB from ~02:02Z, growth over the last 10 min -3.3 / -5.9 MiB; request latency (writer native_probe) QUOTE n=7261 p50 <=10 / p95 <=25 / p99 <=25 ms, 6 unavailable, 0 failed; TRADE n=1800 p50/p95 <=25, p99 <=50 ms; served event age NOT_MEASURED | +| W14 monitor | DEFERRED | GHCR pull denied (token lacks `read:packages`); `monitor_service` stays exited | +| Host lock | released 02:54:45Z | | + +R4 wording note: section 1b asked for Query memory "10 min after the STRICT start ... not growing"; the soak tool +checks the last 10 min. Over the first 10 min memory rose (+30 MiB in the first 5 min on each replica) and then +held at 260-277 MiB (13 % of the 2 GiB cap) for the last 40 min. The intent of the rule (no per-burst retention, far +below 1.6 GiB) is met. The literal "first 10 min" reading is not, and that is recorded here. + +Not done in the window: W14 (above); old-identity container cleanup (section 5c) waits for its own owner approval. diff --git a/upgrade/evidence/releases/v2.2.5/RELEASE_NOTES.md b/upgrade/evidence/releases/v2.2.5/RELEASE_NOTES.md new file mode 100644 index 00000000..e46a5996 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/RELEASE_NOTES.md @@ -0,0 +1,67 @@ +# Quant Data Layer v2.2.5 + +Compact release: configuration, container definitions, mesh certificates and one Query fix. No Rust binary changed. +Deployed to production in the maintenance window of 2026-10-20 (01:28-02:54Z, forward path, no rollback). +Certificate: [CERTIFICATE.md](CERTIFICATE.md) / [certificate.json](certificate.json): **PASS under P1**, a post-hoc +packaging decision on how G5 is scoped that the owner must confirm before the tag (CERTIFICATE.md section 4). + +## Contents + +- **IDR-127**: the repository carries what production runs: catalog r12 (716 bindings, +4 OKX BTC-USD-SWAP inverse + bindings), consumer manifests TS Paper r11 and alpha-okx r15, routing r29, crypto demand r8, promotion scope r11, + acquisition r20 (port-less OKX URLs) ([semantic-parity.json](semantic-parity.json)). +- **Versioned compose for the KN roles**: `deploy/compose/qdl-v2-stable-kn.yml` + per-release env files (images by + digest); healthchecks on stream_kn, market_projector and rust_core; 15 s cadence on Kafka, Query, stable_redis; + stable_redis log rotation. `scripts/kn_versioned_compose.py parity` compares `cpus` with a 1e-6 vCPU tolerance + (compose passes `cpus` through float32: 2.25 -> NanoCpus 2249999872). +- **IDR-129**: Query releases warmup memory: warmup bodies leave in 256 KiB slices, refused batch items drop their + traceback frames, and an idle gc + malloc_trim runs above `QDL_QUERY_MEMORY_SOFT_LIMIT_MIB` (default 448, 0 + disables; at most once per 120 s, only with the large-warmup lane idle). Isolated A/B, 12 x 64 warmups: RSS + 361-445 MiB vs 472 -> 683 MiB before; warmup latency and 429 counts unchanged. +- **Mesh mTLS rotation**: generation 20261019T084200Z (one CA, 365-day leaves, notAfter 2027-10-19, private material + permission-hardened), replacing the generation that expires 2026-11-20 14:43Z. + +## Runtime (docker inspect, 2026-10-20) + +| Role | Image | +|---|---| +| query_kn x2 | `qdl-v2-python:2.2.5-9b6747f` `sha256:753604f8abaa866e2de30c7ccaf36168986bc6991550ee326d53e51b83d1550a` | +| ingestors x2, stream_kn x2 | `qdl-v2-rust:2.2.4-9dab224` `sha256:27c79b53...` (unchanged) | +| market_projector x2 | `qdl-v2-rust:2.2.4-c7ce7d3` `sha256:60f83a51...` (unchanged) | +| rust_core x3 | `qdl-v2-rust:2.2.3-rc22-a4e7b3b` `sha256:7c848aad...` (unchanged) | +| kafka1-3, market_cache, stable_redis | `9516fb76...`, `dfa18828...` (unchanged) | +| binance_bar_edge | `qdl-v2-python:2.2.3-rc14-a388537` `sha256:08f356a8...` (held, scoped out) | +| TS writer | `2deb90b0` unchanged (W12-A), new mesh identity, STRICT | +| TS monitor | not started (W14 deferred) | + +SDK: `qdl-sdk 2.4.1`, the same wheel as v2.2.4 (`9f79e032...`, byte-identical rebuild). + +## Window (2026-10-20) + +- Consumer-visible outage **545 s** (writer stop 01:31:04Z -> STRICT READY 64/64 01:40:09Z), including ~2 min of a + coordinator wait-loop bug; execution-ready 53 = pre-window baseline. +- R1 PASS: 17 roles healthy, RestartCount 0, images = the v2.2.5 env; new TS identity accepted by Query and both + Streams, the old one refused; Kafka 3 brokers, URP 0; core 3 members; certificates notAfter 2027-10-19. +- R2 PASS (863 checks, 0 problems) after the `cpus` tolerance fix; R3 build receipt PASS. +- R4 60-min passive soak PASS: writer READY 59/59, 0 auth/protocol failures, 0 restarts, Query 263-277 MiB and flat + over the last 40 min; request latency QUOTE p95 <=25 ms (n=7261), TRADE p95 <=25 ms (n=1800); served event age + NOT_MEASURED. + +## Limits + +- **P1 / G5**: hot-read latency while a Query memory-maintenance run executes is NOT_MEASURED (each run blocks that + replica's loop 136-160 ms; it ran 0 times in production after the window). Owner confirmation needed. +- **Supported load (IDR-128 OPEN)**: the inherited latency envelope was measured with unrelated heavy stacks paused; + a mixed portal workload on the same host is outside the certified scope. The window ran with the portal running. +- Inherited from v2.2.4: G11 PASS only under post-hoc A5; G14 CPU above budget (not a gate); IDR-108 open. +- W14 deferred: no monitor / watchdog runs (GHCR read:packages missing). +- Single host, not HA. +- Three stopped TS containers still mount the 2026-08-22 identity; their removal waits for the owner's approval. +- bar edge stays on its v2.2.3 image; inactive client CAs in the consumer bundles expire 2026-11-24 .. 2026-12-26 + and are used by no running consumer. + +## Rollback + +Old generation + v2.2.4 env until 2026-11-20 14:43Z (rehearsed: 4.5-8.7 min outage). After that date only an +image-only rollback with the new generation remains (not rehearsed). `QDL_QUERY_MEMORY_SOFT_LIMIT_MIB=0` turns the +maintenance hook off without an image change. diff --git a/upgrade/evidence/releases/v2.2.5/drafts/W12_DECISION.md b/upgrade/evidence/releases/v2.2.5/W12_DECISION.md similarity index 98% rename from upgrade/evidence/releases/v2.2.5/drafts/W12_DECISION.md rename to upgrade/evidence/releases/v2.2.5/W12_DECISION.md index 6e16222c..29493028 100644 --- a/upgrade/evidence/releases/v2.2.5/drafts/W12_DECISION.md +++ b/upgrade/evidence/releases/v2.2.5/W12_DECISION.md @@ -1,6 +1,6 @@ # DL v2.2.5 window: W12 decision record (TS writer slot) -Status: proposal for the window owner, 2026-10-19 (Claude). **Verdict: W12-A**: keep writer image 2deb90b0 and switch +Status: decided and applied in the 2026-10-20 window (writer 2deb90b0 with the new identity, BOOTSTRAP then STRICT, READY 64/64). Written 2026-10-19 (Claude). **Verdict: W12-A**: keep writer image 2deb90b0 and switch only its TLS identity mount, as in `MAINTENANCE_WINDOW_PACKET.md` section 5. W12-B (roll the writer to the TS v2.0.0 release image) needs every proof item below to PASS. Item 2 passes. Items 1 and 3 are incomplete and item 4 has only a component-level measurement, so W12-B is not taken in this window. diff --git a/upgrade/evidence/releases/v2.2.5/drafts/W12_DECISION_EVIDENCE.json b/upgrade/evidence/releases/v2.2.5/W12_DECISION_EVIDENCE.json similarity index 100% rename from upgrade/evidence/releases/v2.2.5/drafts/W12_DECISION_EVIDENCE.json rename to upgrade/evidence/releases/v2.2.5/W12_DECISION_EVIDENCE.json diff --git a/upgrade/evidence/releases/v2.2.5/certificate.json b/upgrade/evidence/releases/v2.2.5/certificate.json new file mode 100644 index 00000000..7ec088a9 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/certificate.json @@ -0,0 +1,298 @@ +{ + "schema": "qdl.scoped-release-certificate.v2", + "release": "v2.2.5", + "previous_published_release": "v2.2.4", + "status": "PASS", + "status_basis": "PASS under P1 (POST_HOC_PACKAGING_DECISION 2026-10-20, Claude; requires the owner's confirmation before the tag): G5 split by code path; G5-hot INHERITED (hot-read request path unchanged; the new maintenance hook ran 0 times in production), G5-cold PASS by the IDR-129 A/B, G5-maintenance (hot reads concurrent with a maintenance run) NOT_MEASURED and stated as a limit. Without P1 the predeclared CERTIFICATE_SCOPE.md D3 (b) item makes G5 NOT_MEASURED and the status not PASS (gates_without_p1).", + "post_hoc_decisions": [ + { + "id": "P1", + "label": "POST_HOC_PACKAGING_DECISION", + "made": "2026-10-20 at packaging, after the window receipts", + "by": "Claude (packager); owner confirmation required", + "owner_confirmed": false, + "predeclared_item": "CERTIFICATE_SCOPE.md D3 (b) 'concurrent hot-read latency' (a missing item of (b) is NOT_MEASURED and blocks the G5 claim)", + "what_exists": "RSS, warmup latency, 429 and failed-slice counts per burst for both images; maintenance run durations 136-160 ms (gc 128-152 + trim 8-12, arm H at 1 vCPU); 0 production maintenance runs after the window", + "to_remove": "isolated A/B with a concurrent hot-read driver, 3e9e4d3a vs 753604f8, under the host lock; or the owner accepts P1" + } + ], + "status_rule": "PASS only with no FAIL gate, every inherited gate's delta proof met, R1/R2/R3/R4 PASS, no NOT_MEASURED item upgraded, and required CI green on the PR head (CERTIFICATE.md section 1; inheritance matrix fixed before the window in CERTIFICATE_SCOPE.md). P1 is a post-measurement scoping of G5 and is NOT a predeclared rule.", + "classification": "SCOPED_DATA_LAYER_CONFIG_CERT_QUERY_DELTA_RELEASE_INHERITING_V224_GATES_PASS_UNDER_POST_HOC_P1_SINGLE_HOST_NOT_HA", + "publication_status": "NOT_TAGGED_CERTIFICATE_PASS_UNDER_POST_HOC_P1", + "publication_requires": "owner confirmation of P1 (or the hot-read A/B); required CI green on the PR heads; the release head on origin/main (release.yml merge-base check); the coordinator creates the tag; release.yml is unchanged and accepts status PASS", + "scope": "configuration (IDR-127), versioned KN compose + healthchecks, mesh mTLS generation 20261019T084200Z, Query python image with the IDR-129 fix; rust digests unchanged; TS writer unchanged (W12-A)", + "window": { + "executed": "2026-10-20T01:28Z-02:54:45Z", + "run_by": "coordinator, owner GO", + "dir": "~/.local/state/qdl-v2/releases/v2.2.5/window-20261020T0128Z", + "repo_copy": "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z", + "writer_stop_utc": "2026-10-20T01:31:04Z", + "strict_ready_utc": "2026-10-20T01:40:09Z", + "consumer_visible_outage_s": 545, + "rollback_used": false, + "acceptance": { + "R1": "PASS", + "R2": "PASS after the cpus tolerance fix (window run FAIL on kafka1-3 cpus float32 only)", + "R3": "PASS (build receipt) + IDR-129 delta proof", + "R4": "PASS (60 min passive)", + "W14": "DEFERRED" + }, + "conditions": "portal running, Codex read-only, no load added" + }, + "source_code_sha": { + "python_query": "9b6747fdcefbc3ebd9107776411db4ba9528d5e5", + "rust_ingestors_stream": "9dab22429ea44566587f31d9f56f8b059933c795", + "rust_projector": "c7ce7d3087cb8a2daf82ba941982bd296d488f45", + "rust_core": "a4e7b3b82475b2c4359a27c0fa1144e4f3a2805e", + "note": "release head = the packaging commit on docs/v225-release-package; runtime source after 9b6747f: tooling/docs only (scripts/kn_versioned_compose.py parity tolerance, docstrings, tests, evidence)" + }, + "release_images": { + "python_9b6747f": { + "tag": "qdl-v2-python:2.2.5-9b6747f", + "digest": "sha256:753604f8abaa866e2de30c7ccaf36168986bc6991550ee326d53e51b83d1550a", + "revision_label": "9b6747fdcefbc3ebd9107776411db4ba9528d5e5", + "roles": [ + "query_kn_1", + "query_kn_2" + ], + "build_receipt_sha256": "2bacdc168e07878cff6062b14f26ad4837b8aaca3200ef63e30c61e17406ae0e" + }, + "rust_9dab224": { + "tag": "qdl-v2-rust:2.2.4-9dab224", + "digest": "sha256:27c79b53400eea5582713a3477034c8561f533755e09a94223e254bffadd5c92", + "revision_label": "9dab22429ea44566587f31d9f56f8b059933c795", + "roles": [ + "ingestor_okx_swap", + "ingestor_binance_usdm", + "stream_kn_1", + "stream_kn_2" + ], + "changed": false + }, + "rust_c7ce7d3": { + "tag": "qdl-v2-rust:2.2.4-c7ce7d3", + "digest": "sha256:60f83a5106b0baa33477cf64abee6fab471d80d9c1808981e02270516b11143e", + "revision_label": "c7ce7d3087cb8a2daf82ba941982bd296d488f45", + "roles": [ + "market_projector_1", + "market_projector_2" + ], + "changed": false + }, + "rust_rc22": { + "tag": "qdl-v2-rust:2.2.3-rc22-a4e7b3b", + "digest": "sha256:7c848aadcb0dd28178bc6dc2b58c42df6c2c235de6d4bfd6602ef7c19fa64bfb", + "revision_label": "a4e7b3b82475b2c4359a27c0fa1144e4f3a2805e", + "roles": [ + "rust_core", + "rust_core_2", + "rust_core_3" + ], + "changed": false + }, + "bar_edge_rc14": { + "tag": "qdl-v2-python:2.2.3-rc14-a388537", + "digest": "sha256:08f356a84151c6e865fbdc4a2efe6924df9336d15353254c2b2da684261794f5", + "revision_label": "a388537c897de909257c7f45db44c9ac44a62ccc", + "roles": [ + "binance_bar_edge" + ], + "changed": false, + "note": "held, scoped out" + }, + "kafka": { + "digest": "sha256:9516fb7634bad307d17c33b589fde9023003b0cb761374f500002b980a3149b9", + "roles": [ + "kafka1", + "kafka2", + "kafka3" + ], + "changed": false + }, + "redis": { + "digest": "sha256:dfa18828cbc07b3ae6a95ec7343f6c214fdee2d836197b4be8e9904420762cd8", + "roles": [ + "market_cache", + "stable_redis" + ], + "changed": false + } + }, + "ts_writer": { + "container": "market_data_service_p184w", + "image": "sha256:2deb90b0cc52eae7610fa44692f90df077e9db100ca259e38fd652a2dc1c5dc5", + "revision_label": "30f50a91dbd67ce2a482480be598cf509b25333e", + "slot": "W12-A", + "identity": "gen-20261019T084200Z/identities/trading-system", + "jwt_manifest_revision": 11, + "require_resume": "1", + "started": "2026-10-20T01:38:32Z", + "restart": 0 + }, + "runtime_basis": "docker inspect / docker image inspect, read-only, 2026-10-20 ~03:00Z: 17 DL roles running, healthy, RestartCount 0, OOMKilled false; images equal deploy/compose/qdl-v2-stable-kn.v2.2.5.env", + "tls": { + "generation": "20261019T084200Z", + "ca_sha256_fingerprint": "610c0c6fe0758a872907fbc926c2295dadb7ce31e4d059350fd3fdec567abd12", + "ca_not_after": "2027-10-19T08:42:01Z", + "leaf_not_after": "2027-10-19", + "verify": "118/118 PASS (window-20261020T0128Z/tls-verify.json)", + "previous_generation": "20260822T144323Z", + "previous_ca_sha256_fingerprint": "7b374a30c8de92b954ed2bf3ab9943b290812f250db2f5ac90e9ef5223561487", + "previous_not_after": "2026-11-20T14:43:23Z", + "jwt_keys": "unchanged (not rotated)" + }, + "resource_caps": { + "kafka1-3": "2.25 vCPU (NanoCpus 2249999872 via compose float32)", + "query_kn_1/2": "2.0 vCPU, 2 GiB", + "ingestor_okx_swap": "1.0 vCPU", + "ingestor_binance_usdm": "0.75 vCPU", + "basis": "deploy/compose/qdl-v2-stable-kn.yml, R2 PASS" + }, + "inherited": { + "release": "v2.2.4", + "counted_run": "p184-final-campaign-20261019T040311Z", + "amendments": [ + "G4-A1", + "G4-A2", + "A3", + "A4", + "A5" + ], + "certificate_sha256": "424125483c3e7e97a78503111919eb0df9bd257965c84b44221b3cd41fd70f5f", + "endpoint_report_sha256": "013b66e683a9ed6846a82d8b858a5a5bc5dcb28cebf80688eb7c099fae4740b7", + "scorecard_sha256": "2dc2f8d1daa75acb83ecfff0b2aac6c505b39aac4bd71330ec0678d89bb43470", + "g12_g13_inheritance_sha256": "95088c9cf97999a8d2234749ba72045ddbaa3323b36e314f75c764039848e538", + "condition": "W12-A taken (writer unchanged) and K6 no-op (k6-post topics == k6-pre); rust digests unchanged" + }, + "gates": { + "G1": "INHERITED_PASS", + "G2": "INHERITED_PASS", + "G3": "INHERITED_PASS", + "G4": "INHERITED_PASS", + "G5": "PASS_UNDER_P1", + "G6": "PASS", + "G7": "INHERITED_PASS", + "G8": "INHERITED_PASS", + "G9": "INHERITED_PASS", + "G10": "INHERITED_PASS", + "G11": "INHERITED_PASS_UNDER_A5", + "G12": "INHERITED_PASS", + "G13": "INHERITED_PASS", + "G14": "INHERITED_PASS" + }, + "gates_without_p1": { + "G1": "INHERITED_PASS", + "G2": "INHERITED_PASS", + "G3": "INHERITED_PASS", + "G4": "INHERITED_PASS", + "G5": "NOT_MEASURED", + "G6": "PASS", + "G7": "INHERITED_PASS", + "G8": "INHERITED_PASS", + "G9": "INHERITED_PASS", + "G10": "INHERITED_PASS", + "G11": "INHERITED_PASS_UNDER_A5", + "G12": "INHERITED_PASS", + "G13": "INHERITED_PASS", + "G14": "INHERITED_PASS" + }, + "gates_without_p1_and_a5": { + "G1": "INHERITED_PASS", + "G2": "INHERITED_PASS", + "G3": "INHERITED_PASS", + "G4": "INHERITED_PASS", + "G5": "NOT_MEASURED", + "G6": "PASS", + "G7": "INHERITED_PASS", + "G8": "INHERITED_PASS", + "G9": "INHERITED_PASS", + "G10": "INHERITED_PASS", + "G11": "FAIL", + "G12": "INHERITED_PASS", + "G13": "INHERITED_PASS", + "G14": "INHERITED_PASS" + }, + "gate_basis": { + "G1-G4": "INHERITED v2.2.4 counted run; regression R1 + R4 PASS", + "G5": "PASS under P1: G5-hot inherited (request path unchanged, maintenance ran 0 times in production), G5-cold PASS by the IDR-129 A/B (RSS 361-445 vs 472-743 MiB, warmup p50 6.6-8.3 vs 6.4-8.7 s, 429 991-1118 vs 992-1135 per burst), G5-maintenance NOT_MEASURED", + "G6": "PASS by delta proof D3 (a): no eligibility/freshness/policy code in the IDR-129 diff; execution-ready 53 after STRICT = baseline 53; R4 48-53", + "G7-G10": "INHERITED; rehearsal offset/cursor continuity; R1 URP 0, under-min-ISR 0, core 3 members", + "G11": "INHERITED as v2.2.4: PASS under post-hoc A5, FAIL without; not re-run", + "G12": "INHERITED (binaries unchanged)", + "G13": "INHERITED 76/76 (writer 2deb90b0 unchanged); window BOOTSTRAP -> STRICT READY 64/64", + "G14": "INHERITED; no R4 CPU sample recorded (predeclared not a gate)" + }, + "endpoint_report_sha256": "fbb26280abf8daf493a3cda0c920bb3868562a034d8813ea976960588831baef", + "sdk": { + "name": "qdl-sdk", + "version": "2.4.1", + "wheel_sha256": "9f79e032604bf79db5ca9070c7f8a99b242e7cf22e1659b395b307dc798c28e7", + "builds_identical": true, + "same_as_release": "v2.2.4", + "sbom_sha256": "6bda0014b9ee304b679e44079976bc5d576a524571b5a771807e3aa0cdd2d442", + "release_json_sha256": "273e532665f634b3737d0fa014a3ced15efc468e9dd380ae034d8a2ee451be69", + "generated_contract_digest": "2ee96b1edab01d3185e4fb973f7e3a0715956f8648938039108eb6156187c116", + "built_at": "rebuilt 2026-10-20 from docs/v225-release-package (aa89d83 + this slice): wheel, .cdx.json and .release.json byte-identical to v2.2.4; git diff b5ab3c2 -- qdl_sdk generated contracts scripts/build_qdl_sdk_release.py is empty" + }, + "ci": { + "status": "REQUIRED_EXTERNAL_GATE", + "note": "runs on the PR heads after the push; recorded in the PRs (the file is part of the head)" + }, + "limits": [ + "POST-HOC P1: G5 PASS only with G5-maintenance (hot-read latency while a Query memory-maintenance run executes) NOT_MEASURED; each run blocks the replica loop 136-160 ms, at most once per 120 s, only above 448 MiB RSS; 0 runs in production after the window. Owner confirmation required.", + "Supported load (IDR-128 OPEN, owner 2026-10-19): the inherited latency envelope was measured with unrelated heavy stacks paused; a mixed portal workload on the same host is outside the certified scope. The window and R4 ran with the portal running (passive load).", + "Inherited: G11 PASS only under post-hoc A5; G14 DL CPU 5.75 vCPU above the 5 vCPU budget (not a gate); IDR-108 open; G12 harness shape is not production shape; G13 shadow-certified; writer vendors SDK 2.4.0.", + "Not measured passively: served event age, delivery lag venue->canonical, end-to-end venue->TS cache (inherited from v2.2.4).", + "W14 deferred: monitor_service exited, no DATA_LAYER / cert-expiry / Query-memory watchdog (GHCR read:packages missing).", + "Single host; no HA.", + "Old-identity containers (packet 5c: market_data_service, market_data_service_p184w-dr07-rollback, market_data_service_p184w-r49-rollback) pending owner cleanup approval; test apparatus pinned to 2026-08-22 identities must be repointed.", + "bar edge held on rc14; inactive client CAs in consumer bundles expire 2026-11-24..2026-12-26 (no running consumer uses them).", + "Window outage 545 s includes ~2 min of a coordinator wait-loop bug.", + "R2 window run FAILed on a tool defect (float32 cpus); PASS is the re-run after the fix.", + "R4 Query memory rose in the first 10 min before its plateau; the packet's literal 'first 10 min not growing' wording is not met (intent met)." + ], + "rollback": { + "until_2026-11-20T14:43Z": "packet section 6: old generation + deploy/compose/qdl-v2-stable-kn.v2.2.4.env (Query sha256:3e9e4d3add0f35c5d4b4796c785a35b466c326d3328184f396182b5f51367fff); rehearsed 267.8 s / 519.0 s", + "after": "image-only rollback (v2.2.4 env with the new generation env), not rehearsed", + "query_maintenance_off": "QDL_QUERY_MEMORY_SOFT_LIMIT_MIB=0", + "writer": "unchanged image; identity mount follows the generation (render.json rollback commands in the window dir)" + }, + "evidence_sha256": { + "upgrade/evidence/releases/v2.2.5/CERTIFICATE.md": "466421b02fa63299e2c4616c55e55fc7e76396c0d2875a7f898adcc2b33ea975", + "upgrade/evidence/releases/v2.2.5/RELEASE_NOTES.md": "6b409c41b7c007fa36a0776f4251b7a4069b4887418c7732a604c34803f118bf", + "upgrade/evidence/releases/v2.2.5/CERTIFICATE_SCOPE.md": "9f5c3fc747624c3dd2f9ae41b09d81b5a1fdff42644fd42282be15a176cfa596", + "upgrade/evidence/releases/v2.2.5/MAINTENANCE_WINDOW_PACKET.md": "eadb4fe727aabeb9912570dd044770191f9f0c7bf061d21a8ac312bf1ad288bf", + "upgrade/evidence/releases/v2.2.5/W12_DECISION.md": "ca416086b3b4dfe1f650359d417c2dabce55b222f17b13cff7b2cd7de531e614", + "upgrade/evidence/releases/v2.2.5/W12_DECISION_EVIDENCE.json": "05f95dbac13507ddff0c6828e40c532a0183de91e957cf8db9e60c1f3a0d8fdc", + "upgrade/evidence/releases/v2.2.5/python-image-build-receipt.json": "2bacdc168e07878cff6062b14f26ad4837b8aaca3200ef63e30c61e17406ae0e", + "upgrade/evidence/releases/v2.2.5/rehearsal-20261019.json": "9d6586dcd547d4822a062613991dcd9078e2806f45facb5cdf995641bff1a1b0", + "upgrade/evidence/releases/v2.2.5/rehearsal-final-20261019T175600Z.json": "410e0c37229e877a6019099b9b3f37322273667b45f7568f4033355eb10f6096", + "upgrade/evidence/releases/v2.2.5/semantic-parity.json": "0d8e3a3bbc0096691b10cfc0a172779968f5dc68bdc7f301cc00492b536b4861", + "upgrade/evidence/releases/v2.2.5/tls-verify-gen-20261019T084200Z.json": "e3dbbb516d3aee285097c86b6f84fc517c08f3b819c50acca65b6ab8f1a6c6aa", + "upgrade/evidence/releases/v2.2.5/compose-parity-v224-deployed-generation.json": "81186862b857c5c7e97db09d4c3b7577db920a606377e975922c3e98ac42470e", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/SHA256SUMS": "6cc3bc1bb3ddb1dd88a593438ca262702ee09b8ddc1795912f51f8aa45430498", + "deploy/compose/qdl-v2-stable-kn.yml": "50c1f0146f5a1aa7d8a648d7774c776a221584ee4fe10ece009e3dc56408592f", + "deploy/compose/qdl-v2-stable-kn.v2.2.5.env": "c6770d5d928e25a1f238dc05c12bccaff23a45aef5066b413da10f76cd6c30ae", + "deploy/compose/qdl-v2-stable-kn.v2.2.4.env": "b728d3b4ed9b4997435de4d49067827b6a2529f3e844206f0253fcc871549fd7", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/T_S": "f0a769b7dd19ced70c115be2361351bb06d4f23eeefdc2969dc622fd8ab228ca", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/T_W1": "a8cefdea3b4b80ef01b3f6e574d6b62f9e76a092f8ab0b9b0a1db79efd138e6c", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/baseline-writer.json": "572502bf1e47f6b1cbe433ea858747cd54a35dc3a07ec58d9f8c2c4ee2946ce7", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/decision.txt": "d5274c1765b414435bf6f7ccde46eb1af0539d95e0c6616b149cf40fcdcd82ba", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/k6-post.json": "b9bac571226a3743ff44be98fbe4b7c12a1e633dbc758f03dad994e8b484b507", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/k6-pre.json": "812d42e6f4358d5232ecfcdcc988366efa887d01f167bdba8841c6344b42c9ee", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/pre-parity.json": "184e7a139d57a8db7c3f4415035d871aa20b7069193dba993deb184e9d97d0f3", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/query-mem-w12.txt": "6d0a1d171d9c493a0f089ef2219d892841194e9c55b7dd82a5b354a6ec830af7", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r1.json": "eb47296dc53080413e878737c7655a359a1864f46e3cd58b391d2ba390df4100", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-note.json": "de59d499b8b9fc724075dddb80653f08c2e49faefb6c00d54acb4df43b4fdc2c", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-parity-rerun.json": "15415306d81a76cc8a82dad3fb7b073ec75abeabbcc472492ae9097ced0de70c", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-parity.json": "83f98eb60bed0dc50fc3f12fb6718498bc4b3a684f12eb6b41315ca9150c7709", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r4-soak.jsonl": "82a4e9aa61cb7289dfd29cee679863d1dc9a1f292ac83c53c5518c7172635dbe", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r4-soak.out": "d4301a18a6e26c1ca5f971d52efa0f8de7fab05c3b2675e171073e28e828bddf", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-perms.out": "94dbfb555b8bf818f8415cc6fba924cb6c17994a7bd2c574b932577856ca30ed", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-verify.json": "0a650aa55b50db5bee5f25ec424300433b2c29a4d5585f3bf287e68ea7e04449", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-verify.out": "d271178827e273c9702735c97a4e8c961cffb8c1305878525a2b98f5b583dd1b", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12a-ready.json": "452c464de3727e0fc3c4ca5fac194ae6781be9c39ba3e7781277f20f27c3cdd4", + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12b-ready.json": "3879b063cb2aaffcac13eb519cb9ec8e7f2f1062af85e21492acc8990461c2dd" + }, + "evidence_sha256_note": "the .md entries are the files as committed with this certificate; certificate.json cannot list its own sha256" +} diff --git a/upgrade/evidence/releases/v2.2.5/drafts/RELEASE_NOTES.md b/upgrade/evidence/releases/v2.2.5/drafts/RELEASE_NOTES.md deleted file mode 100644 index 3a6d44ea..00000000 --- a/upgrade/evidence/releases/v2.2.5/drafts/RELEASE_NOTES.md +++ /dev/null @@ -1,38 +0,0 @@ -# Data Layer v2.2.5 release notes (DRAFT, not released) - -Status: DRAFT. v2.2.5 is published only after the maintenance window (`MAINTENANCE_WINDOW_PACKET.md`) passes its -acceptance R1-R4 and the certificate scope (`CERTIFICATE_SCOPE.md`) is issued. Numbers marked TBD come from the -window receipts. - -## Contents - -- IDR-127: the repository carries what production runs: catalog r12 (716 bindings, +4 OKX BTC-USD-SWAP inverse - bindings), consumer manifests TS Paper r11 and alpha-okx r15, routing r29, crypto demand r8, promotion scope r11, - acquisition r20 (port-less OKX URLs) (`semantic-parity.json`). -- Versioned compose for the KN roles: `deploy/compose/qdl-v2-stable-kn.yml` + per-release env files (images by - digest); healthchecks on stream_kn, market_projector and rust_core; 15 s cadence on Kafka, Query, stable_redis. -- IDR-129: Query releases warmup memory (sliced 256 KiB warmup bodies, request traceback release, idle gc + - malloc_trim above `QDL_QUERY_MEMORY_SOFT_LIMIT_MIB`, default 448); isolated proof 361-445 MiB over 12 bursts vs - 472 -> 683 MiB before, latency unchanged. -- Mesh mTLS rotation: generation 20261019T084200Z (one CA, 365-day leaves, notAfter 2027-10-19, private material - permission-hardened), replacing the generation that expires 2026-11-20 14:43Z. - -## Runtime after the window - -| Role | Image | -|---|---| -| query_kn x2 | qdl-v2-python:2.2.5-9b6747f (sha256:753604f8...), DL dev 9b6747f with IDR-129 | -| rust_core x3, ingestors, stream_kn x2, market_projector x2, Kafka, Redis, bar edge | unchanged v2.2.4 digests | -| TS writer | 2deb90b0 unchanged (W12-A), new mesh identity | -| TS monitor | TS v2.0.1 (W14) | - -## Limits (carried into the certificate) - -- **Supported load (IDR-128, owner decision 2026-10-19):** the latency envelope was measured with unrelated heavy - stacks paused; a mixed portal workload on the same host is outside the certified scope. IDR-128 stays OPEN for a - later host split / IO isolation; no new tuning campaign in this release. -- Single host, not HA (unchanged). -- G5/G6 rest on the IDR-129 delta proof, not on inheritance; the rest per `CERTIFICATE_SCOPE.md` section 2. -- bar edge stays on its v2.2.3 image (catalog r11 / acquisition r19 checkpoint); inactive client CAs in the consumer - bundles expire 2026-11-24 .. 2026-12-26 and are not used by any running consumer. -- Window outage: TBD (rehearsed 251-519 s over two isolated runs). diff --git a/upgrade/evidence/releases/v2.2.5/endpoint-report.json b/upgrade/evidence/releases/v2.2.5/endpoint-report.json new file mode 100644 index 00000000..3c79a7fc --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/endpoint-report.json @@ -0,0 +1,227 @@ +{ + "idr129_delta_proof": { + "isolated_ab": { + "arm_A_production_image_3e9e4d3a": { + "bursts": 12, + "evidence": { + "path": "~/.local/state/qdl-v2/idr129-query-rss-20261019b/A-stage.out", + "sha256": "d758dbff687a7446d5267bce4715014406fbbbc3f8609dfacf0315238a92c3e2" + }, + "failed_slices_per_burst_range": [ + 27, + 37 + ], + "rss_mib_burst1": 471.8, + "rss_mib_last": 683.0, + "rss_mib_range": [ + 471.8, + 743.7 + ], + "status_429_per_burst_range": [ + 992, + 1135 + ], + "warmup_200_p50_ms_range": [ + 6400, + 8681.5 + ] + }, + "arm_H_fixed_image_84512ab": { + "bursts": 12, + "evidence": { + "path": "~/.local/state/qdl-v2/idr129-query-rss-20261019c/H.out", + "sha256": "643dcc60d45a48dffbc4cc7bf6979a560315f12d8b794e2f227c208385faabbd" + }, + "failed_slices_per_burst_range": [ + 26, + 35 + ], + "rss_mib_burst1": 361.1, + "rss_mib_last": 445.0, + "rss_mib_range": [ + 361.1, + 445.0 + ], + "status_429_per_burst_range": [ + 991, + 1118 + ], + "warmup_200_p50_ms_range": [ + 6596.0, + 8306 + ] + }, + "concurrent_hot_read_latency": "NOT_MEASURED (the harness drives warmups only)", + "harness": "scripts/idr129_query_rss_isolated.py", + "image_equivalence": "84512ab and the released 9b6747f carry identical qdl/api_v2/router.py, qdl/query/service.py, qdl/runtime/memory_maintenance.py, qdl/runtime/stable.py (git diff empty); 9b6747f adds the IDR-127 config", + "shape": "one Query replica, 1 vCPU / 2 GiB, private copy of the 64 burst products (production volume), 64 concurrent SDK-shaped warmups per burst x 12, no manual gc/trim during bursts" + }, + "production_after_window": { + "basis": "docker logs --since 2026-10-20T01:33:00Z query_kn_1/2 | grep -c kind=memory_maintenance (read-only)", + "checked_utc": "2026-10-20T03:00Z", + "memory_maintenance_runs_since_window": 0, + "query_mem_mib_at_check": { + "query_kn_1": 227.8, + "query_kn_2": 233.6 + } + }, + "rehearsal_burst": { + "receipt": "upgrade/evidence/releases/v2.2.5/rehearsal-final-20261019T175600Z.json", + "result": "3 x 64 warmups on image 753604f8, baseline 133.4 MiB, peaks 160-172, settled 156.8, no restart/OOM: PASS (near-zero row volume)", + "sha256": "410e0c37229e877a6019099b9b3f37322273667b45f7568f4033355eb10f6096" + } + }, + "inherited": { + "certificate": { + "path": "upgrade/evidence/releases/v2.2.4/certificate.json", + "sha256": "424125483c3e7e97a78503111919eb0df9bd257965c84b44221b3cd41fd70f5f" + }, + "counted_run": "p184-final-campaign-20261019T040311Z", + "endpoint_report": { + "path": "upgrade/evidence/releases/v2.2.4/endpoint-report.json", + "sha256": "013b66e683a9ed6846a82d8b858a5a5bc5dcb28cebf80688eb7c099fae4740b7" + }, + "note": "G1-G4, G7-G14 numbers are those of the v2.2.4 report (same rust digests, same TS writer image); G5/G6 per CERTIFICATE.md section 4", + "release": "v2.2.4" + }, + "limits": [ + "Stage-100 latency/capacity numbers are inherited from v2.2.4, measured with unrelated heavy stacks paused (IDR-128 OPEN); mixed portal workload is outside the certified scope. The window ran with the portal running.", + "G5: hot-read latency concurrent with a Query memory-maintenance run (RSS >= 448 MiB) is NOT_MEASURED (CERTIFICATE.md section 4).", + "Served event age, delivery lag and end-to-end latency were not measured passively in the window.", + "Single host; no HA.", + "W14 monitor deferred: no DATA_LAYER watchdog runs.", + "Containers still holding the 2026-08-22 identity (packet section 5c) await owner cleanup approval." + ], + "release": "v2.2.5", + "schema": "qdl.release-endpoint-report.v2", + "scope": "Data Layer v2.2.5 on the Kafka-native stack after the 2026-10-20 maintenance window: mesh mTLS generation 20261019T084200Z, versioned KN compose with healthchecks, IDR-127 configuration, Query image with the IDR-129 fix. Rust binaries unchanged. Stage-100 workload numbers are INHERITED from v2.2.4 (not re-measured); the numbers measured for v2.2.5 are the window receipts (passive production, no load added) and the IDR-129 isolated A/B. Not a TS order/accounting/alpha certification.", + "window": { + "conditions": { + "codex": "running read-only (not paused)", + "load_added": "none (passive)", + "note": "IDR-128: the v2.2.4 envelope was measured with unrelated heavy stacks paused; these window numbers were not", + "portal": "running (not paused)" + }, + "consumer_visible_outage_s": 545, + "dir": "~/.local/state/qdl-v2/releases/v2.2.5/window-20261020T0128Z", + "outage_note": "includes ~2 min of a coordinator wait-loop bug at W10 (operator script)", + "r1": { + "certs_notafter": "2027-10-19", + "core_members": 3, + "images_match_v225_env": true, + "k6": "pre == post", + "kafka_brokers": 3, + "projector_lag_sum": { + "kn-projector-v3-a": 277, + "kn-projector-v3-b": 56 + }, + "query_mem_max_mib": 188.3, + "query_new_identity": "READY x2", + "query_old_identity": "refused rc=60", + "restart_count": 0, + "roles_up_healthy": 17, + "stream_new_identity": "Verification OK x2", + "stream_old_identity": "verify error num=20", + "under_min_isr": 0, + "urp": 0, + "verdict": "PASS", + "writer_auth_protocol_lines_since_T_S": { + "files": 0, + "stdout": 0 + }, + "writer_ready": "64/64 STRICT, execution_ready 53" + }, + "r2_compose_parity": { + "rerun_after_tool_fix": { + "checked": 863, + "intended_deltas": 6, + "problems": [], + "sha256": "15415306d81a76cc8a82dad3fb7b073ec75abeabbcc472492ae9097ced0de70c", + "utc": "2026-10-20T03:00:55Z", + "verdict": "PASS" + }, + "window_run": { + "problems": "kafka1-3 cpus live 2.249999872 vs compose 2.25 (float32 rounding)", + "sha256": "83f98eb60bed0dc50fc3f12fb6718498bc4b3a684f12eb6b41315ca9150c7709", + "verdict": "FAIL" + } + }, + "r4_soak": { + "auth_protocol": { + "dl_roles": { + "query_kn_1": {}, + "query_kn_2": {}, + "stream_kn_1": {}, + "stream_kn_2": {} + }, + "writer_files": {}, + "writer_stdout": {} + }, + "data_policy_refusals": {}, + "execution_ready_min_max": [ + 48, + 53 + ], + "latency": { + "delivery_lag_venue_to_canonical": "NOT_MEASURED passively; inherited from v2.2.4 G4", + "end_to_end_venue_to_ts_cache": "NOT_MEASURED passively; inherited from v2.2.4 G2", + "request_latency": { + "basis": "QUERY_REQUEST_START_TO_REDIS_APPLY_DECISION_MONOTONIC (writer native_probe histograms differenced over the soak; bucket upper bounds)", + "by_feed": { + "QUOTE": { + "failed": 0, + "max_ms_since_start": 193.76, + "mean_ms": 9.37, + "p50_le_ms": 10, + "p95_le_ms": 25, + "p99_le_ms": 25, + "requests": 7261, + "unavailable": 6 + }, + "TRADE": { + "failed": 0, + "max_ms_since_start": 37.703, + "mean_ms": 11.99, + "p50_le_ms": 25, + "p95_le_ms": 25, + "p99_le_ms": 50, + "requests": 1800, + "unavailable": 0 + } + } + }, + "served_event_age": "NOT_MEASURED (no passive counter); inherited from v2.2.4 G5/G6" + }, + "minutes": 60, + "query_mem_mib": { + "query_kn_1": { + "first": 188.5, + "growth_last_10min": -3.3, + "last": 265.0, + "max": 270.4 + }, + "query_kn_2": { + "first": 183.2, + "growth_last_10min": -5.9, + "last": 263.3, + "max": 277.2 + } + }, + "restarts": {}, + "samples": 59, + "sha256": { + "r4-soak.jsonl": "82a4e9aa61cb7289dfd29cee679863d1dc9a1f292ac83c53c5518c7172635dbe", + "r4-soak.out": "d4301a18a6e26c1ca5f971d52efa0f8de7fab05c3b2675e171073e28e828bddf" + }, + "started": "2026-10-20T01:41:23Z", + "verdict": "PASS", + "writer_ready_samples": "59/59" + }, + "repo_copy": "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z (SHA256SUMS)", + "strict_ready_utc": "2026-10-20T01:40:09Z", + "strict_restart_utc": "2026-10-20T01:38:31Z", + "t_w1_marker_utc": "2026-10-20T01:31:00Z", + "w14_monitor": "DEFERRED (GHCR read:packages missing)", + "writer_stop_utc": "2026-10-20T01:31:04Z" + } +} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/.gitattributes b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/.gitattributes new file mode 100644 index 00000000..5b7772c1 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/.gitattributes @@ -0,0 +1,2 @@ +# Byte-for-byte copies of window receipts (sha256 in SHA256SUMS): no whitespace normalisation. +* -whitespace -text diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/SHA256SUMS b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/SHA256SUMS new file mode 100644 index 00000000..f32dd29d --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/SHA256SUMS @@ -0,0 +1,19 @@ +a8cefdea3b4b80ef01b3f6e574d6b62f9e76a092f8ab0b9b0a1db79efd138e6c T_W1 +f0a769b7dd19ced70c115be2361351bb06d4f23eeefdc2969dc622fd8ab228ca T_S +d5274c1765b414435bf6f7ccde46eb1af0539d95e0c6616b149cf40fcdcd82ba decision.txt +0a650aa55b50db5bee5f25ec424300433b2c29a4d5585f3bf287e68ea7e04449 tls-verify.json +d271178827e273c9702735c97a4e8c961cffb8c1305878525a2b98f5b583dd1b tls-verify.out +94dbfb555b8bf818f8415cc6fba924cb6c17994a7bd2c574b932577856ca30ed tls-perms.out +184e7a139d57a8db7c3f4415035d871aa20b7069193dba993deb184e9d97d0f3 pre-parity.json +572502bf1e47f6b1cbe433ea858747cd54a35dc3a07ec58d9f8c2c4ee2946ce7 baseline-writer.json +812d42e6f4358d5232ecfcdcc988366efa887d01f167bdba8841c6344b42c9ee k6-pre.json +b9bac571226a3743ff44be98fbe4b7c12a1e633dbc758f03dad994e8b484b507 k6-post.json +6d0a1d171d9c493a0f089ef2219d892841194e9c55b7dd82a5b354a6ec830af7 query-mem-w12.txt +452c464de3727e0fc3c4ca5fac194ae6781be9c39ba3e7781277f20f27c3cdd4 w12a-ready.json +3879b063cb2aaffcac13eb519cb9ec8e7f2f1062af85e21492acc8990461c2dd w12b-ready.json +eb47296dc53080413e878737c7655a359a1864f46e3cd58b391d2ba390df4100 r1.json +83f98eb60bed0dc50fc3f12fb6718498bc4b3a684f12eb6b41315ca9150c7709 r2-parity.json +de59d499b8b9fc724075dddb80653f08c2e49faefb6c00d54acb4df43b4fdc2c r2-note.json +15415306d81a76cc8a82dad3fb7b073ec75abeabbcc472492ae9097ced0de70c r2-parity-rerun.json +82a4e9aa61cb7289dfd29cee679863d1dc9a1f292ac83c53c5518c7172635dbe r4-soak.jsonl +d4301a18a6e26c1ca5f971d52efa0f8de7fab05c3b2675e171073e28e828bddf r4-soak.out diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/T_S b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/T_S new file mode 100644 index 00000000..9904a4a2 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/T_S @@ -0,0 +1 @@ +2026-10-20T01:38:31Z diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/T_W1 b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/T_W1 new file mode 100644 index 00000000..8da06a93 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/T_W1 @@ -0,0 +1 @@ +2026-10-20T01:31:00Z diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/baseline-writer.json b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/baseline-writer.json new file mode 100644 index 00000000..6ed35b88 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/baseline-writer.json @@ -0,0 +1 @@ +{"container_started_unix": 1792413321.8591151, "execution_ready_slices": "53", "heartbeat": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792459788.457978, "ready": "64", "status": "READY", "unhealthy": "0", "v1_fallback": "0"}, "ready": true, "ready_slices": "64", "samples": 2} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/decision.txt b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/decision.txt new file mode 100644 index 00000000..c69e4b9a --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/decision.txt @@ -0,0 +1,2 @@ +Codex: running read-only, not paused (owner chose window at 02:00Z, not a latency measurement). Portal: not paused. +T_W1=2026-10-20T01:31:00Z deadline=T_W1+25min rollback trigger; W14 deferred (GHCR read:packages missing) diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/k6-post.json b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/k6-post.json new file mode 100644 index 00000000..2c02ee3c --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/k6-post.json @@ -0,0 +1,79 @@ +{ + "mode": "observe", + "at_utc": "2026-10-20T01:32:05.811827+00:00", + "runner": { + "backend": "admin-container", + "image": "apache/kafka@sha256:9516fb7634bad307d17c33b589fde9023003b0cb761374f500002b980a3149b9", + "network": "qdl_v2_stable_candidate_stable_internal", + "bootstrap": "kafka1:9092,kafka2:9092,kafka3:9092", + "command_config": "/etc/kafka/secrets/admin.properties", + "cert_dir_mount": "ro" + }, + "plan_status": "MEASURED", + "topics": { + "__transaction_state": { + "planned_keys": { + "segment.ms": "600000" + }, + "c_state": "APPLIED", + "temp_keys": {}, + "temp_state": "NONE", + "other_overrides_match_frozen": true, + "drift": {} + }, + "__consumer_offsets": { + "planned_keys": { + "delete.retention.ms": "600000", + "segment.ms": "60000" + }, + "c_state": "APPLIED", + "temp_keys": { + "min.cleanable.dirty.ratio": null + }, + "temp_state": "ABSENT", + "other_overrides_match_frozen": true, + "drift": {} + } + }, + "partitions": { + "__consumer_offsets-43": { + "size_bytes_by_broker": { + "1": 14075478, + "2": 24204025, + "3": 24203924 + }, + "observation_problems": [], + "log_start_offset": 0, + "log_end_offset": 428471459, + "offset_span": 428471459, + "assigned_replicas": [ + "3", + "2", + "1" + ] + } + }, + "temp_removal": { + "present": false, + "watch_partition": "__consumer_offsets-43", + "assigned_replicas": [ + "1", + "2", + "3" + ], + "observed_replicas": [ + "1", + "2", + "3" + ], + "observation_complete": true, + "observation_problems": [], + "max_size_bytes": 24204025, + "observed_max_size_bytes": 24204025, + "threshold_bytes": 33554432, + "status": "TEMP_NOT_PRESENT", + "remove_recommended": false, + "remove_command": "kafka_internal_topic_compaction.py --remove-temp --apply --cert-dir " + }, + "note": "offset_span is not a record count; replayed records = broker 'Finished loading' line" +} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/k6-pre.json b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/k6-pre.json new file mode 100644 index 00000000..8bd9cfdb --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/k6-pre.json @@ -0,0 +1,79 @@ +{ + "mode": "observe", + "at_utc": "2026-10-20T01:30:17.936658+00:00", + "runner": { + "backend": "admin-container", + "image": "apache/kafka@sha256:9516fb7634bad307d17c33b589fde9023003b0cb761374f500002b980a3149b9", + "network": "qdl_v2_stable_candidate_stable_internal", + "bootstrap": "kafka1:9092,kafka2:9092,kafka3:9092", + "command_config": "/etc/kafka/secrets/admin.properties", + "cert_dir_mount": "ro" + }, + "plan_status": "MEASURED", + "topics": { + "__transaction_state": { + "planned_keys": { + "segment.ms": "600000" + }, + "c_state": "APPLIED", + "temp_keys": {}, + "temp_state": "NONE", + "other_overrides_match_frozen": true, + "drift": {} + }, + "__consumer_offsets": { + "planned_keys": { + "delete.retention.ms": "600000", + "segment.ms": "60000" + }, + "c_state": "APPLIED", + "temp_keys": { + "min.cleanable.dirty.ratio": null + }, + "temp_state": "ABSENT", + "other_overrides_match_frozen": true, + "drift": {} + } + }, + "partitions": { + "__consumer_offsets-43": { + "size_bytes_by_broker": { + "1": 12753176, + "2": 22883248, + "3": 22883147 + }, + "observation_problems": [], + "log_start_offset": 0, + "log_end_offset": 428459264, + "offset_span": 428459264, + "assigned_replicas": [ + "3", + "2", + "1" + ] + } + }, + "temp_removal": { + "present": false, + "watch_partition": "__consumer_offsets-43", + "assigned_replicas": [ + "1", + "2", + "3" + ], + "observed_replicas": [ + "1", + "2", + "3" + ], + "observation_complete": true, + "observation_problems": [], + "max_size_bytes": 22883248, + "observed_max_size_bytes": 22883248, + "threshold_bytes": 33554432, + "status": "TEMP_NOT_PRESENT", + "remove_recommended": false, + "remove_command": "kafka_internal_topic_compaction.py --remove-temp --apply --cert-dir " + }, + "note": "offset_span is not a record count; replayed records = broker 'Finished loading' line" +} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/pre-parity.json b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/pre-parity.json new file mode 100644 index 00000000..bd510b6f --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/pre-parity.json @@ -0,0 +1 @@ +{"verdict": "PASS", "checked": 847, "problems": [], "deltas": 34} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/query-mem-w12.txt b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/query-mem-w12.txt new file mode 100644 index 00000000..fde47dd8 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/query-mem-w12.txt @@ -0,0 +1,36 @@ +01:36:46 qdl_v2_stable_candidate-query_kn_1-1 160.9MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 156.2MiB / 2GiB +01:36:53 qdl_v2_stable_candidate-query_kn_1-1 178.1MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 177.6MiB / 2GiB +01:37:00 qdl_v2_stable_candidate-query_kn_1-1 176.7MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 177.4MiB / 2GiB +01:37:07 qdl_v2_stable_candidate-query_kn_1-1 176.8MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 177.5MiB / 2GiB +01:37:14 qdl_v2_stable_candidate-query_kn_1-1 176.8MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 177.8MiB / 2GiB +01:37:21 qdl_v2_stable_candidate-query_kn_1-1 176.9MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 178.4MiB / 2GiB +01:37:29 qdl_v2_stable_candidate-query_kn_1-1 177MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 178.6MiB / 2GiB +01:37:36 qdl_v2_stable_candidate-query_kn_1-1 177.1MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 166.8MiB / 2GiB +01:37:43 qdl_v2_stable_candidate-query_kn_1-1 177.1MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 166.3MiB / 2GiB +01:37:50 qdl_v2_stable_candidate-query_kn_1-1 177.3MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 168.6MiB / 2GiB +01:37:57 qdl_v2_stable_candidate-query_kn_1-1 177.7MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 168.3MiB / 2GiB +01:38:04 qdl_v2_stable_candidate-query_kn_1-1 177.6MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 168.6MiB / 2GiB +01:38:11 qdl_v2_stable_candidate-query_kn_1-1 177.8MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 169.3MiB / 2GiB +01:38:18 qdl_v2_stable_candidate-query_kn_1-1 177.9MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 167.8MiB / 2GiB +01:38:25 qdl_v2_stable_candidate-query_kn_1-1 178.1MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 174.1MiB / 2GiB +01:38:32 qdl_v2_stable_candidate-query_kn_1-1 178.1MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 174.7MiB / 2GiB +01:38:39 qdl_v2_stable_candidate-query_kn_1-1 188.3MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 184.8MiB / 2GiB +01:38:46 qdl_v2_stable_candidate-query_kn_1-1 187.4MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 185MiB / 2GiB +01:38:53 qdl_v2_stable_candidate-query_kn_1-1 187.8MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 187.1MiB / 2GiB +01:39:00 qdl_v2_stable_candidate-query_kn_1-1 187.9MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 185MiB / 2GiB +01:39:07 qdl_v2_stable_candidate-query_kn_1-1 178.9MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 184.6MiB / 2GiB +01:39:14 qdl_v2_stable_candidate-query_kn_1-1 179MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 185.7MiB / 2GiB +01:39:21 qdl_v2_stable_candidate-query_kn_1-1 179.8MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 185.2MiB / 2GiB +01:39:28 qdl_v2_stable_candidate-query_kn_1-1 180.6MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 185.7MiB / 2GiB +01:39:35 qdl_v2_stable_candidate-query_kn_1-1 180.5MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 185.7MiB / 2GiB +01:39:42 qdl_v2_stable_candidate-query_kn_1-1 181MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 186.3MiB / 2GiB +01:39:49 qdl_v2_stable_candidate-query_kn_1-1 182.2MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 186.1MiB / 2GiB +01:39:56 qdl_v2_stable_candidate-query_kn_1-1 182.6MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 186.5MiB / 2GiB +01:40:03 qdl_v2_stable_candidate-query_kn_1-1 180.5MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 187.3MiB / 2GiB +01:40:10 qdl_v2_stable_candidate-query_kn_1-1 180.8MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 187.8MiB / 2GiB +01:40:17 qdl_v2_stable_candidate-query_kn_1-1 181.2MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 188.3MiB / 2GiB +01:40:24 qdl_v2_stable_candidate-query_kn_1-1 182.7MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 188MiB / 2GiB +01:40:31 qdl_v2_stable_candidate-query_kn_1-1 184.1MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 188.2MiB / 2GiB +01:40:38 qdl_v2_stable_candidate-query_kn_1-1 184.3MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 188.3MiB / 2GiB +01:40:46 qdl_v2_stable_candidate-query_kn_1-1 184.6MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 178.9MiB / 2GiB +01:40:53 qdl_v2_stable_candidate-query_kn_1-1 185.4MiB / 2GiB qdl_v2_stable_candidate-query_kn_2-1 180.8MiB / 2GiB diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r1.json b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r1.json new file mode 100644 index 00000000..6fb9ac0f --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r1.json @@ -0,0 +1 @@ +{"schema":"qdl.v225.window-r1.v1","T_W1":"2026-10-20T01:31:00Z","T_S":"2026-10-20T01:38:31Z","strict_ready_utc":"2026-10-20T01:40:09Z","outage_s":545,"roles_up_healthy":17,"restart_count":0,"images_match_v225_env":true,"query_new_identity":"READY x2","query_old_identity":"refused rc=60","stream_new_identity":"Verification OK x2","stream_old_identity":"verify error num=20","kafka_brokers":3,"urp":0,"under_min_isr":0,"core_members":3,"projector_lag_sum":{"kn-projector-v3-a":277,"kn-projector-v3-b":56},"writer_auth_protocol_lines_since_T_S":{"files":0,"stdout":0},"writer_ready":"64/64 STRICT, execution_ready 53","certs_notafter":"2027-10-19","query_mem_max_mib":188.3,"k6":"pre == post","w14":"DEFERRED (GHCR read:packages missing)","verdict":"PASS"} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-note.json b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-note.json new file mode 100644 index 00000000..36adbc1c --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-note.json @@ -0,0 +1,7 @@ +{ + "schema": "qdl.v225.window-r2-note.v1", + "tool_verdict": "FAIL", + "problems": ["kafka1.cpus live=2.249999872 compose=2.25", "kafka2.cpus live=2.249999872 compose=2.25", "kafka3.cpus live=2.249999872 compose=2.25"], + "assessment": "docker compose converts cpus 2.25 through float32 to NanoCpus 2249999872; not a configuration drift (difference 1.3e-7 vCPU); every other role and field matches. Tool tolerance fix pending (kn_versioned_compose.py parity: compare cpus with a 1e-6 tolerance).", + "recorded_utc": "2026-10-20T01:41:30Z" +} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-parity-rerun.json b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-parity-rerun.json new file mode 100644 index 00000000..d7f5122e --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-parity-rerun.json @@ -0,0 +1 @@ +{"verdict": "PASS", "checked": 863, "problems": [], "deltas": 6} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-parity.json b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-parity.json new file mode 100644 index 00000000..50ed99b9 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r2-parity.json @@ -0,0 +1 @@ +{"verdict": "FAIL", "checked": 863, "problems": ["kafka1.cpus: live=2.249999872 compose=2.25", "kafka2.cpus: live=2.249999872 compose=2.25", "kafka3.cpus: live=2.249999872 compose=2.25"], "deltas": 6} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r4-soak.jsonl b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r4-soak.jsonl new file mode 100644 index 00000000..c1475ef2 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r4-soak.jsonl @@ -0,0 +1,60 @@ +{"query_mem_mib": {"query_kn_1": 188.5, "query_kn_2": 183.2}, "t": "2026-10-20T01:41:23Z", "unix": 1792460483.9, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792460464.780169, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 194.2, "query_kn_2": 188.6}, "t": "2026-10-20T01:42:26Z", "unix": 1792460546.1, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792460524.917047, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 200.2, "query_kn_2": 192.0}, "t": "2026-10-20T01:43:28Z", "unix": 1792460608.2, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792460585.056834, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 206.2, "query_kn_2": 195.4}, "t": "2026-10-20T01:44:30Z", "unix": 1792460670.3, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792460645.194377, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 210.0, "query_kn_2": 200.6}, "t": "2026-10-20T01:45:32Z", "unix": 1792460732.4, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792460705.328276, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 218.6, "query_kn_2": 215.1}, "t": "2026-10-20T01:46:34Z", "unix": 1792460794.5, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792460765.460832, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 223.5, "query_kn_2": 208.7}, "t": "2026-10-20T01:47:36Z", "unix": 1792460856.6, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792460855.6626, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 229.4, "query_kn_2": 213.0}, "t": "2026-10-20T01:48:38Z", "unix": 1792460918.8, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792460915.789292, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 234.7, "query_kn_2": 217.3}, "t": "2026-10-20T01:49:40Z", "unix": 1792460980.9, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792460975.910411, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 241.4, "query_kn_2": 221.1}, "t": "2026-10-20T01:50:42Z", "unix": 1792461043.0, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792461036.03781, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 247.6, "query_kn_2": 225.2}, "t": "2026-10-20T01:51:45Z", "unix": 1792461105.1, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792461096.194941, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 253.4, "query_kn_2": 231.4}, "t": "2026-10-20T01:52:47Z", "unix": 1792461167.2, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792461156.322786, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 257.0, "query_kn_2": 233.2}, "t": "2026-10-20T01:53:49Z", "unix": 1792461229.3, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "50", "last_seen_unix": 1792461216.500861, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 260.0, "query_kn_2": 238.1}, "t": "2026-10-20T01:54:51Z", "unix": 1792461291.4, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792461276.633301, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 260.1, "query_kn_2": 242.0}, "t": "2026-10-20T01:55:53Z", "unix": 1792461353.6, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792461336.753301, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 260.7, "query_kn_2": 246.4}, "t": "2026-10-20T01:56:55Z", "unix": 1792461415.7, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792461396.878054, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 259.6, "query_kn_2": 250.2}, "t": "2026-10-20T01:57:57Z", "unix": 1792461477.8, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792461457.010293, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 260.7, "query_kn_2": 254.8}, "t": "2026-10-20T01:58:59Z", "unix": 1792461539.9, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792461517.136358, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 258.5, "query_kn_2": 259.5}, "t": "2026-10-20T02:00:02Z", "unix": 1792461602.0, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "51", "last_seen_unix": 1792461577.269077, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 261.5, "query_kn_2": 259.3}, "t": "2026-10-20T02:01:04Z", "unix": 1792461664.1, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792461637.415533, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 260.2, "query_kn_2": 262.7}, "t": "2026-10-20T02:02:06Z", "unix": 1792461726.3, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792461697.555258, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 260.7, "query_kn_2": 261.6}, "t": "2026-10-20T02:03:08Z", "unix": 1792461788.4, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792461787.742393, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 260.0, "query_kn_2": 261.7}, "t": "2026-10-20T02:04:10Z", "unix": 1792461850.5, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792461847.876097, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 260.6, "query_kn_2": 262.7}, "t": "2026-10-20T02:05:12Z", "unix": 1792461912.6, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792461908.039901, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 260.4, "query_kn_2": 262.5}, "t": "2026-10-20T02:06:14Z", "unix": 1792461974.7, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792461968.168358, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 262.2, "query_kn_2": 261.7}, "t": "2026-10-20T02:07:16Z", "unix": 1792462036.9, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792462028.298192, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 262.6, "query_kn_2": 262.3}, "t": "2026-10-20T02:08:18Z", "unix": 1792462099.0, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792462088.449744, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 268.0, "query_kn_2": 262.4}, "t": "2026-10-20T02:09:21Z", "unix": 1792462161.1, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792462148.581373, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 267.9, "query_kn_2": 277.2}, "t": "2026-10-20T02:10:23Z", "unix": 1792462223.2, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "51", "last_seen_unix": 1792462208.708428, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 268.6, "query_kn_2": 267.1}, "t": "2026-10-20T02:11:25Z", "unix": 1792462285.3, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792462268.841236, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 269.6, "query_kn_2": 266.3}, "t": "2026-10-20T02:12:27Z", "unix": 1792462347.4, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792462328.96357, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 267.6, "query_kn_2": 267.0}, "t": "2026-10-20T02:13:29Z", "unix": 1792462409.5, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792462389.078454, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 267.7, "query_kn_2": 267.0}, "t": "2026-10-20T02:14:31Z", "unix": 1792462471.7, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792462449.200904, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 265.1, "query_kn_2": 266.6}, "t": "2026-10-20T02:15:33Z", "unix": 1792462533.8, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792462509.341051, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 263.8, "query_kn_2": 268.5}, "t": "2026-10-20T02:16:35Z", "unix": 1792462595.9, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792462569.506946, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 264.3, "query_kn_2": 266.2}, "t": "2026-10-20T02:17:38Z", "unix": 1792462658.0, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792462629.640514, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 264.6, "query_kn_2": 267.3}, "t": "2026-10-20T02:18:40Z", "unix": 1792462720.1, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792462719.833998, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 265.1, "query_kn_2": 262.9}, "t": "2026-10-20T02:19:42Z", "unix": 1792462782.2, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "51", "last_seen_unix": 1792462779.96331, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 266.7, "query_kn_2": 262.9}, "t": "2026-10-20T02:20:44Z", "unix": 1792462844.4, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792462840.087239, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 263.5, "query_kn_2": 263.2}, "t": "2026-10-20T02:21:46Z", "unix": 1792462906.5, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "51", "last_seen_unix": 1792462900.237881, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 264.9, "query_kn_2": 263.6}, "t": "2026-10-20T02:22:48Z", "unix": 1792462968.6, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792462960.365535, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 264.5, "query_kn_2": 263.7}, "t": "2026-10-20T02:23:50Z", "unix": 1792463030.7, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "51", "last_seen_unix": 1792463020.547223, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 265.0, "query_kn_2": 263.6}, "t": "2026-10-20T02:24:52Z", "unix": 1792463092.8, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "50", "last_seen_unix": 1792463080.668071, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 262.8, "query_kn_2": 263.5}, "t": "2026-10-20T02:25:54Z", "unix": 1792463154.9, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "51", "last_seen_unix": 1792463140.790969, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 264.5, "query_kn_2": 267.2}, "t": "2026-10-20T02:26:57Z", "unix": 1792463217.0, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "48", "last_seen_unix": 1792463200.915407, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 264.3, "query_kn_2": 266.2}, "t": "2026-10-20T02:27:59Z", "unix": 1792463279.2, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792463261.033329, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 264.7, "query_kn_2": 267.5}, "t": "2026-10-20T02:29:01Z", "unix": 1792463341.3, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "51", "last_seen_unix": 1792463321.156312, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 265.6, "query_kn_2": 266.9}, "t": "2026-10-20T02:30:03Z", "unix": 1792463403.4, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "49", "last_seen_unix": 1792463381.277033, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 268.3, "query_kn_2": 269.2}, "t": "2026-10-20T02:31:05Z", "unix": 1792463465.5, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "51", "last_seen_unix": 1792463441.420219, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 267.5, "query_kn_2": 268.6}, "t": "2026-10-20T02:32:07Z", "unix": 1792463527.6, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792463501.576184, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 270.4, "query_kn_2": 267.7}, "t": "2026-10-20T02:33:09Z", "unix": 1792463589.8, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "52", "last_seen_unix": 1792463561.693627, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 263.1, "query_kn_2": 268.1}, "t": "2026-10-20T02:34:11Z", "unix": 1792463651.9, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "51", "last_seen_unix": 1792463621.809065, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 263.8, "query_kn_2": 268.3}, "t": "2026-10-20T02:35:13Z", "unix": 1792463714.0, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "50", "last_seen_unix": 1792463712.002373, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 262.9, "query_kn_2": 263.1}, "t": "2026-10-20T02:36:16Z", "unix": 1792463776.1, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "51", "last_seen_unix": 1792463772.127517, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 264.7, "query_kn_2": 264.2}, "t": "2026-10-20T02:37:18Z", "unix": 1792463838.2, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "51", "last_seen_unix": 1792463832.257101, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 263.4, "query_kn_2": 263.5}, "t": "2026-10-20T02:38:20Z", "unix": 1792463900.3, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792463892.389424, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 264.7, "query_kn_2": 264.2}, "t": "2026-10-20T02:39:22Z", "unix": 1792463962.5, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "50", "last_seen_unix": 1792463952.558061, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 263.9, "query_kn_2": 263.8}, "t": "2026-10-20T02:40:24Z", "unix": 1792464024.6, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "50", "last_seen_unix": 1792464012.674074, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"query_mem_mib": {"query_kn_1": 265.0, "query_kn_2": 263.3}, "t": "2026-10-20T02:41:23Z", "unix": 1792464083.9, "writer": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "51", "last_seen_unix": 1792464072.805274, "ready": "64", "status": "READY", "unhealthy": "0"}} +{"dl_roles_auth_protocol": {"query_kn_1": {}, "query_kn_2": {}, "stream_kn_1": {}, "stream_kn_2": {}}, "execution_ready_min_max": [48, 53], "query_mem_mib": {"query_kn_1": {"first": 188.5, "growth_last_10min": -3.3, "last": 265.0, "max": 270.4}, "query_kn_2": {"first": 183.2, "growth_last_10min": -5.9, "last": 263.3, "max": 277.2}}, "request_latency_native_probe": {"QUOTE": {"failed": 0, "max_ms_since_start": 193.76, "mean_ms": 9.37, "p50_le_ms": 10, "p95_le_ms": 25, "p99_le_ms": 25, "requests": 7261, "unavailable": 6}, "TRADE": {"failed": 0, "max_ms_since_start": 37.703, "mean_ms": 11.99, "p50_le_ms": 25, "p95_le_ms": 25, "p99_le_ms": 50, "requests": 1800, "unavailable": 0}}, "restarts_during": {}, "samples": 59, "served_event_age": "NOT_MEASURED (no passive counter in the writer heartbeat)", "started": "2026-10-20T01:41:23Z", "summary": true, "writer_logs": {"auth_protocol": {}, "data_policy_by_code_venue_symbol_feed": {}}, "writer_ready_samples": "59/59", "writer_stdout_auth_protocol": {}} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r4-soak.out b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r4-soak.out new file mode 100644 index 00000000..5614db16 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/r4-soak.out @@ -0,0 +1,59 @@ +{ + "dl_roles_auth_protocol": { + "query_kn_1": {}, + "query_kn_2": {}, + "stream_kn_1": {}, + "stream_kn_2": {} + }, + "execution_ready_min_max": [ + 48, + 53 + ], + "query_mem_mib": { + "query_kn_1": { + "first": 188.5, + "growth_last_10min": -3.3, + "last": 265.0, + "max": 270.4 + }, + "query_kn_2": { + "first": 183.2, + "growth_last_10min": -5.9, + "last": 263.3, + "max": 277.2 + } + }, + "request_latency_native_probe": { + "QUOTE": { + "failed": 0, + "max_ms_since_start": 193.76, + "mean_ms": 9.37, + "p50_le_ms": 10, + "p95_le_ms": 25, + "p99_le_ms": 25, + "requests": 7261, + "unavailable": 6 + }, + "TRADE": { + "failed": 0, + "max_ms_since_start": 37.703, + "mean_ms": 11.99, + "p50_le_ms": 25, + "p95_le_ms": 25, + "p99_le_ms": 50, + "requests": 1800, + "unavailable": 0 + } + }, + "restarts_during": {}, + "samples": 59, + "served_event_age": "NOT_MEASURED (no passive counter in the writer heartbeat)", + "started": "2026-10-20T01:41:23Z", + "summary": true, + "writer_logs": { + "auth_protocol": {}, + "data_policy_by_code_venue_symbol_feed": {} + }, + "writer_ready_samples": "59/59", + "writer_stdout_auth_protocol": {} +} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-perms.out b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-perms.out new file mode 100644 index 00000000..62000f5e --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-perms.out @@ -0,0 +1 @@ +{"gen_dir": "/home/bobby/.local/state/qdl-v2/tls/gen-20261019T084200Z", "problems": [], "verdict": "PASS"} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-verify.json b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-verify.json new file mode 100644 index 00000000..e4d7ebb3 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-verify.json @@ -0,0 +1,160 @@ +{ + "checks": 118, + "new": "gen-20261019T084200Z", + "new_ca": { + "not_after": "2027-10-19T08:42:01Z", + "not_before": "2026-10-19T08:42:01Z", + "sha256_fingerprint": "610c0c6fe0758a872907fbc926c2295dadb7ce31e4d059350fd3fdec567abd12" + }, + "new_truststores": { + "truststore-kn-v220.jks": [ + "610c0c6fe0758a872907fbc926c2295dadb7ce31e4d059350fd3fdec567abd12" + ], + "truststore.jks": [ + "610c0c6fe0758a872907fbc926c2295dadb7ce31e4d059350fd3fdec567abd12" + ] + }, + "old": "20260822T144323Z", + "old_ca": { + "not_after": "2026-11-20T14:43:23Z", + "sha256_fingerprint": "7b374a30c8de92b954ed2bf3ab9943b290812f250db2f5ac90e9ef5223561487" + }, + "old_truststores": { + "truststore-kn-v220.jks": [ + "772d0b682f5e9720c64b2cb4d23b72c1f4870dfaa0a29d94fdcc7dcd03159fcf", + "7b374a30c8de92b954ed2bf3ab9943b290812f250db2f5ac90e9ef5223561487" + ], + "truststore.jks": [ + "7b374a30c8de92b954ed2bf3ab9943b290812f250db2f5ac90e9ef5223561487" + ] + }, + "problems": [], + "schema": "qdl.mesh-tls-verify.v1", + "slots": { + "identities/trading-system": { + "cn": "stable-trading-system", + "eku": [ + "TLS Web Client Authentication", + "TLS Web Server Authentication" + ], + "not_after": "2027-10-19T08:42:05Z", + "old_not_after": "2026-11-20T14:43:25Z", + "san": [ + "DNS:localhost", + "DNS:stable-trading-system" + ] + }, + "kn-tls/kn-projector": { + "cn": "kn-projector", + "eku": [ + "TLS Web Client Authentication", + "TLS Web Server Authentication" + ], + "not_after": "2027-10-19T08:42:06Z", + "old_not_after": "2026-12-25T04:31:41Z", + "san": [ + "DNS:kn-projector", + "DNS:localhost" + ] + }, + "kn-tls/kn-stream": { + "cn": "kn-stream", + "eku": [ + "TLS Web Client Authentication", + "TLS Web Server Authentication" + ], + "not_after": "2027-10-19T08:42:06Z", + "old_not_after": "2026-12-25T04:31:41Z", + "san": [ + "DNS:kn-stream", + "DNS:localhost" + ] + }, + "stable-certs/authority-dispatcher": { + "cn": "stable-authority-dispatcher", + "eku": [ + "TLS Web Client Authentication", + "TLS Web Server Authentication" + ], + "not_after": "2027-10-19T08:42:04Z", + "old_not_after": "2026-11-20T14:43:25Z", + "san": [ + "DNS:localhost", + "DNS:stable-authority-dispatcher" + ] + }, + "stable-certs/core": { + "cn": "phase8-core", + "eku": [ + "TLS Web Client Authentication", + "TLS Web Server Authentication" + ], + "not_after": "2027-10-19T08:42:03Z", + "old_not_after": "2026-11-20T14:43:24Z", + "san": [ + "DNS:localhost", + "DNS:phase8-core" + ] + }, + "stable-certs/producer": { + "cn": "phase8-producer", + "eku": [ + "TLS Web Client Authentication", + "TLS Web Server Authentication" + ], + "not_after": "2027-10-19T08:42:03Z", + "old_not_after": "2026-11-20T14:43:24Z", + "san": [ + "DNS:localhost", + "DNS:phase8-producer" + ] + }, + "stable-certs/projector": { + "cn": "phase8-consumer", + "eku": [ + "TLS Web Client Authentication", + "TLS Web Server Authentication" + ], + "not_after": "2027-10-19T08:42:03Z", + "old_not_after": "2026-11-20T14:43:24Z", + "san": [ + "DNS:localhost", + "DNS:phase8-consumer" + ] + }, + "stable-certs/query": { + "cn": "stable-query", + "eku": [ + "TLS Web Client Authentication", + "TLS Web Server Authentication" + ], + "not_after": "2027-10-19T08:42:09Z", + "old_not_after": "2026-11-20T14:43:26Z", + "san": [ + "DNS:localhost", + "DNS:qdl-v2-query", + "DNS:query_v2_1", + "DNS:query_v2_2" + ] + }, + "stable-certs/stream": { + "cn": "stable-stream", + "eku": [ + "TLS Web Client Authentication", + "TLS Web Server Authentication" + ], + "not_after": "2027-10-19T08:42:09Z", + "old_not_after": "2026-11-20T14:43:27Z", + "san": [ + "DNS:localhost", + "DNS:qdl-v2-stream", + "DNS:qdl-v2-stream-a", + "DNS:qdl-v2-stream-b", + "DNS:stream_v2_active", + "DNS:stream_v2_passive" + ] + } + }, + "verdict": "PASS", + "verified_utc": "2026-10-20T01:29:13Z" +} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-verify.out b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-verify.out new file mode 100644 index 00000000..584dc15b --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-verify.out @@ -0,0 +1 @@ +{"verdict": "PASS", "checks": 118, "problems": []} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12a-ready.json b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12a-ready.json new file mode 100644 index 00000000..f52b15ba --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12a-ready.json @@ -0,0 +1 @@ +{"container_started_unix": 1792460207.3705983, "execution_ready_slices": "50", "heartbeat": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "50", "last_seen_unix": 1792460300.895913, "ready": "64", "status": "READY", "unhealthy": "0", "v1_fallback": "0"}, "ready": true, "ready_slices": "64", "samples": 3} diff --git a/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12b-ready.json b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12b-ready.json new file mode 100644 index 00000000..444760d0 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12b-ready.json @@ -0,0 +1 @@ +{"container_started_unix": 1792460312.0249522, "execution_ready_slices": "53", "heartbeat": {"consumer_mode": "V2_PRIMARY", "demanded": "64", "execution_ready": "53", "last_seen_unix": 1792460404.62426, "ready": "64", "status": "READY", "unhealthy": "0", "v1_fallback": "0"}, "ready": true, "ready_slices": "64", "samples": 3} From 7d28d9cb1614322e87396f59597fc3e8ab103e24 Mon Sep 17 00:00:00 2001 From: BobbyAxerol Date: Tue, 20 Oct 2026 03:48:51 +0000 Subject: [PATCH 2/9] v2.2.5: pre-registered isolated Query A/B harness (hot reads during warmup bursts + warmup byte compare) scripts/v225_query_hot_read_ab.py: old Query 3e9e4d3a vs new 753604f8 on one private read-only copy of the market cache; open-loop TS EXECUTION snapshot reads at 10/s during 12 x 64-warmup bursts (incl. memory-maintenance runs), and an A/B/A' warmup byte comparison of every TS r11 requirement. Pass rules HR1-HR5 and BC are fixed in PREREG before the run. --- scripts/v225_query_hot_read_ab.py | 958 ++++++++++++++++++++++++++++++ 1 file changed, 958 insertions(+) create mode 100644 scripts/v225_query_hot_read_ab.py diff --git a/scripts/v225_query_hot_read_ab.py b/scripts/v225_query_hot_read_ab.py new file mode 100644 index 00000000..a1fd38c6 --- /dev/null +++ b/scripts/v225_query_hot_read_ab.py @@ -0,0 +1,958 @@ +#!/usr/bin/env python3 +"""DL v2.2.5 Query A/B: old image 3e9e4d3a vs new image 753604f8 on one isolated private copy of the market cache. + +Purpose (owner decision 2026-10-20, option (b) "Đo luôn rồi tag"): produce the two pieces of evidence the v2.2.5 +certificate still lacks, in one isolated session. + 1. G5 D3 (b) "concurrent hot-read latency": a steady open-loop hot-read driver (TS EXECUTION QUOTE/TRADE + snapshots, the TS writer's request) runs while one Query replica serves repeated 64-warmup bursts, including + the memory-maintenance runs of the new image (RSS >= its soft limit, reached by the bursts themselves; no + manual gc/trim in a scored arm). p50/p95/p99/max per arm. + 2. DR byte comparison: for every TS manifest r11 requirement, the warmup response of the old and the new image + for the same cache state (status, headers, body bytes), with a same-image control request that names the + per-request volatile fields. +The pass rules are pre-registered (PREREG below) and written to ``prereg.json`` before any container starts. + +Boundary: production is read-only. The only production contact is a read-only copy of market-cache keys +(DUMP/HMGET/HGETALL, the IDR-129 harness method) by the ``sync`` container and ``docker inspect`` of query_kn_1 for +its container spec. Every container is ``--rm``, CPU-capped, on one ``--internal`` network (prefix ``qdl-hr-``, +label ``qdl.v225.hotread=true``); ``cleanup`` removes all of them and the network. Needs the host measurement lock +(AGENTS.md 34a) held by ``--lock-owner``. TS identity = the new mesh generation (root-only files, so the drivers +run as root with DAC_READ_SEARCH only); alpha-okx identity = its phase105b client certificate (still trusted). + +Usage (host python): + v225_query_hot_read_ab.py run --output DIR [--lock-owner O] + v225_query_hot_read_ab.py analyze --output DIR + v225_query_hot_read_ab.py cleanup +""" +from __future__ import annotations + +import argparse +import hashlib +import importlib.util +import json +import os +from pathlib import Path +import subprocess +import sys +import time + +ROOT = Path(__file__).resolve().parents[1] +_SPEC = importlib.util.spec_from_file_location("idr129_harness", ROOT / "scripts/idr129_query_rss_isolated.py") +harness = importlib.util.module_from_spec(_SPEC) +_SPEC.loader.exec_module(harness) + +PREFIX = "qdl-hr-" +LABEL = "qdl.v225.hotread=true" +NETWORK = PREFIX + "net" +STACK = "qdl_v2_stable_candidate" +PROD_QUERY = f"{STACK}-query_kn_1-1" +PROD_INTERNAL = f"{STACK}_stable_internal" +OLD_IMAGE = "sha256:3e9e4d3add0f35c5d4b4796c785a35b466c326d3328184f396182b5f51367fff" # v2.2.4 Query 31a5155 +NEW_IMAGE = "sha256:753604f8abaa866e2de30c7ccaf36168986bc6991550ee326d53e51b83d1550a" # v2.2.5 Query 9b6747f +REDIS_IMAGE = harness.REDIS_IMAGE +LOCK = harness.LOCK +STATE = Path.home() / ".local/state/qdl-v2" +TS_TLS = STATE / "tls/gen-20261019T084200Z/identities/trading-system" +TS_JWT = STATE / "655d2106d01f/bundle/identities-rotate-20260822T144323Z/trading-system-jwt" +OKX_TLS = STATE / "r135-local-batch-fair-e905747-20260920T135150Z/identities/alpha-okx" +OKX_JWT = STATE / "r135-local-batch-fair-e905747-20260920T135150Z/identities/alpha-okx-jwt" +MOUNTS = harness.MOUNTS +TS = "trading-system.paper.stable" +OKX = "alpha.okx.paper.stable" + +PREREG = { + "schema": "qdl.v225.query-ab-prereg.v1", + "images": {"A_old": OLD_IMAGE, "B_new": NEW_IMAGE}, + "replica": "one Query replica per arm, production container spec of query_kn_1 except private cache/quota Redis, --cpus 1.0 --memory 2g (the IDR-129 arm shape)", + "order": "byte compare (A and B side by side), then arm B, then arm A", + "burst": {"slices": 64, "bursts": 12, "gap_s": 10, "settle_s": 5, "rounds": 4, + "mix": "TS r11 BAR 1m x 1,000 rows (10 slices) + alpha-okx BAR 1m..1h cycled to 54 slices with rows " + "2500/5000/2500/5000/2500/5000/2500/10000 (the IDR-129 stage ladder); SDK 2.4 redirect/queued " + "retry shape", + "note": "alpha-binance identities belong to the rotated CA, so alpha slices are alpha-okx only"}, + "hot_reads": {"driver": "open loop, fixed schedule (no coordinated omission), TS identity", + "request": "GET /v2/market-data/{uid}/snapshot, TS r11 QUOTE and TRADE requirements (EXECUTION), round robin", + "rate_hz": 10.0, + "rate_note": "4x the production rate so that a ~150 ms maintenance run overlaps reads (about 1.5 expected per run)", + "production_reference": "R4 soak 2026-10-20: 7261 QUOTE + 1800 TRADE in 60 min = 2.5/s over two replicas", + "phases": "pre (60 s before burst 1), scored (first burst start .. last burst end), post (60 s)"}, + "maintenance": "the new image's default QDL_QUERY_MEMORY_SOFT_LIMIT_MIB (448); no manual gc/trim in any scored arm", + "rules": { + "HR1": "scored hot reads (any HTTP status; transport errors counted apart): p95_B <= max(1.10*p95_A, p95_A+10 ms) and p99_B <= max(1.10*p99_A, p99_A+25 ms)", + "HR2": "coverage: arm B has >= 1 memory_maintenance run inside its scored window with >= 1 hot read overlapping it; otherwise INCONCLUSIVE (never PASS)", + "HR3": "bounded pause: every hot read overlapping a maintenance run has latency <= run_ms + p99 of B's non-overlapping scored reads + 50 ms, and every run_ms <= 500", + "HR4": "transport errors + HTTP 5xx in B <= A + max(2, 0.5 % of B's scored reads)", + "HR5": "non-200 share of scored reads in B <= A + 1 percentage point", + "BC": "for every TS r11 requirement, in each of 2 passes, a valid triple (A, B, A' = second request to A, issued " + "together with the sync paused) exists within 3 attempts; valid = A and A' differ only in scalar leaves " + "(V); PASS when for every valid triple: status A == B, content-type A == B, Content-Length header == body " + "length on A and B, no Transfer-Encoding, the JSON leaf paths where A and B differ are a subset of V, and " + "the bodies are byte-equal after replacing the raw values at V by one placeholder", + "verdict": "PASS only when HR1-HR5 and BC all PASS; INCONCLUSIVE when HR2 is not met; FAIL otherwise", + "secondary": "RSS per burst, warmup latency, 429 counts and failed slices are reported, not gated"}, +} + +PLAN = r''' +import json, sys, yaml +realm = "/consumer-realms/" +ts = yaml.safe_load(open(realm + "trading-system.paper.stable-r11.yaml"))["spec"]["requirements"] +okx = yaml.safe_load(open(realm + "alpha.okx.paper.stable-r15.yaml"))["spec"]["requirements"] +order = {"1m": 0, "3m": 1, "5m": 2, "15m": 3, "30m": 4, "1h": 5} +bars = [{"consumer": "trading-system.paper.stable", "requirement": r} for r in ts if r["feed"] == "BAR"] +bars += sorted(({"consumer": "alpha.okx.paper.stable", "requirement": r} for r in okx + if r["feed"] == "BAR" and r.get("interval") in order), + key=lambda e: (order[e["requirement"]["interval"]], e["requirement"]["instrument_uid"])) +json.dump({"ts_r11": ts, "bars": bars}, sys.stdout) +''' + +SYNC = r''' +"""Read-only copy of market-cache keys into the private cache, kept fresh; pauses on /work/pause.""" +import json, os, sys, time +import redis +from qdl.adapters.intervals import canonical_interval_ms +from qdl.query import DataRequirement +from qdl.projection.kn_state_codec import state_partition +from qdl.runtime.kn_bar_readback import BUCKET_OPENS, binding_product_key +from qdl.runtime.kn_market_cache import KnMarketCacheReader +from qdl.runtime.stable_catalog import StableSourceCatalog + +plan = json.load(open("/work/plan.json")) +src = redis.Redis.from_url(os.environ["SRC_URL"], socket_timeout=5) +dst = redis.Redis.from_url(os.environ["DST_URL"], socket_timeout=5) +catalog = StableSourceCatalog.load("/runtime/stable-source-bindings.yaml") +reader = KnMarketCacheReader(src, "paper") +stats = {"keys": 0, "bytes": 0, "missing": 0} + +def atomic(path, text): + with open(path + ".tmp", "w") as handle: + handle.write(text) + os.replace(path + ".tmp", path) + +def copy(key): + blob = src.dump(key) + if blob is None: + stats["missing"] += 1 + return False + dst.restore(key, 0, blob, replace=True) + stats["keys"] += 1 + stats["bytes"] += len(blob) + return True + +def lpk_of(item): + binding = catalog.binding_for(DataRequirement.from_mapping({**item, "warmup_limit": 0})) + return binding, binding_product_key(binding, "paper") + +generations, ckpts = {}, set() + +def copy_bars(entry, rows_needed, tail_only): + binding, lpk = lpk_of(entry["requirement"]) + code = lpk.encode() + ready = src.hmget(reader.pointer_key(lpk), "ready")[0] + if ready is None: + return None + generation = int(ready) + meta = {k.decode(): v.decode() for k, v in src.hgetall(f"kn3:paper:bm:{generation}:{code}").items()} + if int(meta.get("rows") or 0) < rows_needed + 5 or not meta.get("last"): + return None + step = canonical_interval_ms(binding.interval) + last = int(meta["last"]) + tail = tail_only and generations.get(code) == generation + generations[code] = generation + first_needed = last - (2 * BUCKET_OPENS if tail else rows_needed + 200) * step + for key in (reader.pointer_key(lpk), f"kn3:paper:src:{code}", f"kn3:paper:bm:{generation}:{code}"): + copy(key) + for bucket in range(first_needed // (BUCKET_OPENS * step), last // (BUCKET_OPENS * step) + 1): + for kind in ("b", "bd", "bs"): + copy(f"kn3:paper:{kind}:{generation}:{code}:{bucket}") + ckpts.add(reader.checkpoint_key(reader.bars_topic, state_partition(lpk, reader.bars_partitions))) + return {**entry, "binding_id": binding.binding_id, "retained_rows": int(meta["rows"]), "copied_rows": rows_needed} + +def copy_latest(lpk): + ptr = reader.pointer_key(lpk) + ready = src.hmget(ptr, "ready")[0] + if ready is None: + return False + copy(ptr) + ok = copy(f"kn3:paper:l:{int(ready)}:{lpk.encode()}") + copy(reader.checkpoint_key(reader.latest_topic, state_partition(lpk, reader.latest_partitions))) + return ok + +chosen = [] +for entry in plan["bars"]: + rows = 10000 if entry["consumer"] != "trading-system.paper.stable" else None + got = None + for need in ((rows,) if rows else (10000, 1000)): + got = copy_bars(entry, need, False) + if got is not None: + break + if got is not None: + chosen.append(got) +latest = [] +for item in plan["ts_r11"]: + if item["feed"] == "BAR": + continue + try: + _binding, lpk = lpk_of(item) + except Exception as error: + latest.append({"requirement": item, "lpk": None, "copied": False, "error": type(error).__name__}) + continue + latest.append({"requirement": item, "lpk": lpk, "copied": copy_latest(lpk)}) +for key in sorted(ckpts): + copy(key) +atomic("/work/products.json", json.dumps(chosen)) +atomic("/work/latest.json", json.dumps([{**e, "lpk": e["lpk"].encode() if e["lpk"] else None} for e in latest])) +print(json.dumps({"bars": len(chosen), "latest": sum(1 for e in latest if e["copied"]), **stats}), flush=True) +atomic("/work/sync-ready", "1") +deadline = time.monotonic() + float(os.environ["SYNC_DEADLINE_SECONDS"]) +last_bars, rnd = time.monotonic(), 0 +while time.monotonic() < deadline and not os.path.exists("/work/stop"): + if os.path.exists("/work/pause"): + atomic("/work/paused", str(rnd)) + time.sleep(0.02) + continue + for entry in latest: + if entry["lpk"] is not None: + copy_latest(entry["lpk"]) + if time.monotonic() - last_bars >= 15: + for entry in chosen: + copy_bars(entry, entry["copied_rows"], True) + for key in sorted(ckpts): + copy(key) + last_bars = time.monotonic() + rnd += 1 + if rnd % 120 == 0: + print(json.dumps({"round": rnd, **stats}), flush=True) + time.sleep(0.5) +print(json.dumps({"final_round": rnd, **stats}), flush=True) +''' + +COMMON = r''' +import asyncio, hashlib, json, os, re, sys, time +import httpx +from qdl_sdk.credentials import RotatingJwtCredentialProvider +from qdl_sdk.errors import DataLayerError +from qdl_sdk.models import (BarRevisionPolicy, DataRequirement, Feed, GapPolicy, Grade, RecoveryPolicy, StalePolicy) +from qdl_sdk.tls import WorkloadTlsConfig +from qdl_sdk.transport import RestQueryTransport, REPLICA_LANE_BUSY + +ISSUER, AUDIENCE = "https://identity.qdl.stable.internal", "qdl-v2-stable" +ROLES = ("historical_reader", "market_data_reader", "stream_consumer") +IDS = {"trading-system.paper.stable": ("trading-system", "stable-trading-system-rs256-v1", + "spiffe://qdl/paper/trading-system-stable", 11), + "alpha.okx.paper.stable": ("alpha-okx", "stable-alpha-okx-rs256-v1", "spiffe://qdl/paper/alpha-okx-stable", 15)} +ENUMS = {"feed": Feed, "consumer_grade": Grade, "stale_policy": StalePolicy, "gap_policy": GapPolicy, + "recovery": RecoveryPolicy, "bar_revision_policy": BarRevisionPolicy, "event_recency_policy": StalePolicy} + +def requirement(item, rows=None): + fields = {k: (ENUMS[k](v) if k in ENUMS and v is not None else v) for k, v in item.items()} + if rows is not None: + fields["warmup_limit"] = rows + return DataRequirement(**fields) + +def transport(consumer, url, timeout=10.0): + slug, key_id, subject, revision = IDS[consumer] + tls = WorkloadTlsConfig("/identities/trading-system/ca.crt", f"/identities/{slug}/client.crt", + f"/identities/{slug}/client.key") + cred = RotatingJwtCredentialProvider(private_key_file=f"/identities/{slug}-jwt/private.key", key_id=key_id, + algorithm="RS256", issuer=ISSUER, audience=AUDIENCE, subject=subject, environment="paper", roles=ROLES, + venues=("BINANCE", "OKX"), consumer_manifest_revision=revision, lifetime_seconds=600, + refresh_before_seconds=120) + return RestQueryTransport(url, timeout_seconds=timeout, credential_provider=cred, tls=tls) + +async def wait_live(t, seconds=600): + deadline = time.monotonic() + seconds + while True: + try: + await t._client.get("/health/live") + return + except httpx.HTTPError: + if time.monotonic() > deadline: + raise + await asyncio.sleep(2) + +def now_ms(): + return time.time_ns() / 1e6 +''' + +CMP_DRIVER = COMMON + r''' +cfg = json.load(open("/work/cmp.json")) +CONSUMER = "trading-system.paper.stable" + +def atomic(path, text): + with open(path + ".tmp", "w") as handle: + handle.write(text) + os.replace(path + ".tmp", path) + +async def pause(): + for stale in ("/work/paused",): + if os.path.exists(stale): + os.unlink(stale) + atomic("/work/pause", "1") + deadline = time.monotonic() + 10 + while not os.path.exists("/work/paused"): + if time.monotonic() > deadline: + raise RuntimeError("sync did not acknowledge the pause") + await asyncio.sleep(0.02) + +def resume(): + for path in ("/work/pause", "/work/paused"): + if os.path.exists(path): + os.unlink(path) + +async def fetch(t, req): + headers = await t._headers(req, CONSUMER) + t0 = time.perf_counter() + response = await t._client.get(f"/v2/market-data/{req.instrument_uid}/warmup", params=req.query_params(), + headers=headers) + body = response.content + return {"status": response.status_code, "ms": round((time.perf_counter() - t0) * 1e3, 1), + "content_length": response.headers.get("content-length"), + "transfer_encoding": response.headers.get("transfer-encoding"), + "content_type": response.headers.get("content-type"), "body": body} + +def leaves(value, path=()): + if isinstance(value, dict): + out = {("__keys__",) + path: sorted(value)} + for k, v in value.items(): + out.update(leaves(v, path + (k,))) + return out + if isinstance(value, list): + out = {("__len__",) + path: len(value)} + for i, v in enumerate(value): + out.update(leaves(v, path + (i,))) + return out + return {path: value} + +def diff(a, b): + la, lb = leaves(a), leaves(b) + return sorted({repr(k) for k in set(la) | set(lb) if la.get(k, "") != lb.get(k, "")}) + +def mask(raw, values): + for value in sorted(values, key=lambda v: -len(v)): + raw = raw.replace(value, b'""') + return raw + +async def main(): + ta = transport(CONSUMER, cfg["urls"]["A"], timeout=60.0) + tb = transport(CONSUMER, cfg["urls"]["B"], timeout=60.0) + await wait_live(ta) + await wait_live(tb) + await asyncio.sleep(5) + out = [] + for pass_no in range(1, cfg["passes"] + 1): + for index, item in enumerate(cfg["requirements"]): + req = requirement(item) + record = {"pass": pass_no, "index": index, "instrument_uid": item["instrument_uid"], "feed": item["feed"], + "interval": item.get("interval"), "warmup_limit": item.get("warmup_limit"), "attempts": []} + for attempt in range(1, 4): + await pause() + try: + a, b, a2 = await asyncio.gather(fetch(ta, req), fetch(tb, req), fetch(ta, req)) + finally: + resume() + parsed = {} + for name, r in (("A", a), ("B", b), ("A2", a2)): + try: + parsed[name] = json.loads(r["body"]) + except ValueError: + parsed[name] = None + digest = hashlib.sha256(r["body"]).hexdigest() + path = f"/out/bodies/{digest}.json" + if not os.path.exists(path): + with open(path, "wb") as handle: + handle.write(r["body"]) + r["sha256"], r["length"] = digest, len(r["body"]) + v_paths = diff(parsed["A"], parsed["A2"]) if None not in (parsed["A"], parsed["A2"]) else [""] + structural = [p for p in v_paths if "__len__" in p or "__keys__" in p or p == ""] + ab_paths = diff(parsed["A"], parsed["B"]) if None not in (parsed["A"], parsed["B"]) else [""] + la, lb, la2 = (leaves(parsed[n]) if parsed[n] is not None else {} for n in ("A", "B", "A2")) + volatile_values = set() + for p in v_paths: + key = eval(p) if p.startswith("(") else None # our own repr of a tuple path + for source in (la, lb, la2): + value = source.get(key) if key is not None else None + # mask only values that cannot collide with row content: strings, and ints of >= 10 digits + if isinstance(value, str) or (isinstance(value, int) and not isinstance(value, bool) + and abs(value) >= 10**9): + volatile_values.add(json.dumps(value).encode()) + na, nb = mask(a["body"], volatile_values), mask(b["body"], volatile_values) + entry = {"attempt": attempt, + **{f"{n}_{k}": r[k] for n, r in (("A", a), ("B", b), ("A2", a2)) + for k in ("status", "ms", "content_length", "transfer_encoding", "content_type", "sha256", "length")}, + "volatile_paths": v_paths, "a_vs_b_paths": ab_paths, + "valid": not structural, + "normalized_equal": na == nb, + "normalized_sha256": {"A": hashlib.sha256(na).hexdigest(), "B": hashlib.sha256(nb).hexdigest()}, + "rows": len(parsed["A"].get("data", [])) if isinstance(parsed["A"], dict) else None} + record["attempts"].append(entry) + if entry["valid"]: + break + await asyncio.sleep(1.0) + out.append(record) + print(json.dumps({"pass": pass_no, "index": index, "feed": item["feed"], + "status": [record["attempts"][-1]["A_status"], record["attempts"][-1]["B_status"]], + "valid": record["attempts"][-1]["valid"], + "equal": record["attempts"][-1]["normalized_equal"]}), flush=True) + await asyncio.sleep(1.2) + json.dump(out, open("/out/byte-compare-raw.json", "w"), indent=1) + await ta.close() + await tb.close() + +asyncio.run(main()) +''' + +BURST_DRIVER = COMMON + r''' +cfg = json.load(open("/work/burst.json")) +seq = 0 + +def event(kind, **kw): + with open("/work/events.jsonl", "a") as handle: + handle.write(json.dumps({"kind": kind, "unix_ms": now_ms(), **kw}) + "\n") + +def probe(action, **kw): + global seq + seq += 1 + name = f"{seq:05d}" + tmp = f"/probe/tmpcmd-{name}" + with open(tmp, "w") as handle: + json.dump({"action": action, **kw}, handle) + os.rename(tmp, f"/probe/cmd-{name}.json") + deadline = time.monotonic() + 120 + while time.monotonic() < deadline: + out = f"/probe/out-{name}.json" + if os.path.exists(out): + reply = json.load(open(out)) + os.unlink(out) + return reply + time.sleep(0.1) + return {"ok": False, "error": "probe timeout"} + +async def slice_warmup(t, consumer, req, out): + started = time.perf_counter() + for round_ in range(cfg["rounds"]): + for attempt in range(3): + error = None + for redirect in (True, False): + t0 = time.perf_counter() + try: + payload = await t.warmup(req, consumer_id=consumer, replica_redirect=redirect) + except DataLayerError as caught: + out["requests"].append(["429" if caught.code == "RATE_LIMITED" else caught.code, + round((time.perf_counter() - t0) * 1e3)]) + error = caught + if redirect and caught.code == "RATE_LIMITED" and caught.reason == REPLICA_LANE_BUSY: + continue + break + except httpx.HTTPError as caught: + out["requests"].append(["TRANSPORT", round((time.perf_counter() - t0) * 1e3)]) + error = caught + break + out["requests"].append(["200", round((time.perf_counter() - t0) * 1e3)]) + return + if not isinstance(error, DataLayerError) or error.code != "RATE_LIMITED" or not error.retryable: + break + await asyncio.sleep(max(250 * (attempt + 1), error.retry_after_ms or 0) / 1000) + await asyncio.sleep(1.0) + out["failed"] += 1 + +async def main(): + transports = {c: transport(c, cfg["url"]) for c in IDS} + reqs = [(p["consumer"], requirement(p["requirement"], p["rows"])) for p in cfg["slices"]] + await wait_live(transports["trading-system.paper.stable"]) + while not os.path.exists("/work/go"): + await asyncio.sleep(0.2) + event("baseline", stats=probe("stats")) + for burst in range(1, cfg["bursts"] + 1): + out = {"requests": [], "failed": 0} + event("burst_start", burst=burst) + t0 = time.perf_counter() + await asyncio.gather(*(slice_warmup(transports[c], c, r, out) for c, r in reqs)) + wall = round(time.perf_counter() - t0, 1) + event("burst_end", burst=burst) + await asyncio.sleep(cfg["settle_s"]) + statuses = {} + for status, _ in out["requests"]: + statuses[status] = statuses.get(status, 0) + 1 + ok = sorted(ms for s, ms in out["requests"] if s == "200") + stats = probe("stats") + result = stats.get("result", {}) + event("burst_stats", burst=burst, wall_s=wall, statuses=statuses, failed_slices=out["failed"], + req200_ms_p50=ok[len(ok) // 2] if ok else None, rss_mib=result.get("rss_mib"), + uordblks_mib=(result.get("mallinfo2") or {}).get("uordblks_mib")) + print(json.dumps({"burst": burst, "wall_s": wall, "statuses": statuses, "failed": out["failed"], + "rss_mib": result.get("rss_mib")}), flush=True) + await asyncio.sleep(cfg["gap_s"]) + event("done") + for t in transports.values(): + await t.close() + +asyncio.run(main()) +''' + +HOT_DRIVER = COMMON + r''' +cfg = json.load(open("/work/hot.json")) +CONSUMER = "trading-system.paper.stable" + +async def one(t, req, scheduled_ms, records): + headers = await t._headers(req, CONSUMER) + params = req.query_params() + params.pop("limit", None) + sent = now_ms() + t0 = time.perf_counter() + try: + response = await t._client.get(f"/v2/market-data/{req.instrument_uid}/snapshot", params=params, + headers=headers) + status = response.status_code + code = None + if status != 200: + try: + body = response.json() + code = (body.get("error") or body).get("code") if isinstance(body, dict) else None + except ValueError: + code = None + except httpx.HTTPError as caught: + status, code = "TRANSPORT", type(caught).__name__ + records.append([round(scheduled_ms, 1), round(sent, 1), round((time.perf_counter() - t0) * 1e3, 3), status, code, + req.feed.value if hasattr(req.feed, "value") else str(req.feed)]) + +async def main(): + t = transport(CONSUMER, cfg["url"], timeout=10.0) + reqs = [requirement(item) for item in cfg["requirements"]] + await wait_live(t) + await t._headers(reqs[0], CONSUMER) + records, tasks = [], set() + period = 1.0 / cfg["rate_hz"] + open("/work/hot-started", "w").write(str(now_ms())) + base = time.perf_counter() + base_ms = now_ms() + i = 0 + while not os.path.exists("/work/hot-stop"): + target = base + i * period + delay = target - time.perf_counter() + if delay > 0: + await asyncio.sleep(delay) + task = asyncio.create_task(one(t, reqs[i % len(reqs)], base_ms + i * period * 1e3, records)) + tasks.add(task) + task.add_done_callback(tasks.discard) + i += 1 + if tasks: + await asyncio.wait(tasks, timeout=15) + with open("/work/hot.jsonl", "w") as handle: + for row in records: + handle.write(json.dumps(row) + "\n") + await t.close() + +asyncio.run(main()) +''' + + +def sh(*args, check=True, timeout=180): + result = subprocess.run(list(args), capture_output=True, text=True, timeout=timeout) + if check and result.returncode != 0: + raise RuntimeError(f"{args[:4]} failed: {result.stderr.strip()[:600]}") + return result.stdout.strip() + + +def utc() -> str: + return time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()) + + +def require_lock(owner: str): + try: + lock = json.loads(LOCK.read_text()) + except (OSError, ValueError): + raise SystemExit("host measurement lock is absent: acquire it first (AGENTS.md 34a)") + if lock.get("owner") != owner: + raise SystemExit(f"host measurement lock is held by {lock.get('owner')}, not {owner}") + + +def prod_spec(): + raw = json.loads(sh("docker", "inspect", PROD_QUERY))[0] + mounts = {m["Destination"]: m["Source"] for m in raw["Mounts"] if m["Destination"] in MOUNTS} + if set(mounts) != set(MOUNTS): + raise RuntimeError(f"production Query mounts differ: {sorted(mounts)}") + env = dict(item.split("=", 1) for item in raw["Config"]["Env"]) + return env, mounts, raw["Config"]["Cmd"] + + +def ro(mounts: dict) -> list[str]: + return [a for dst, src in sorted(mounts.items()) for a in ("--mount", f"type=bind,src={src},dst={dst},readonly")] + + +def writable_dir(path: Path) -> Path: + path.mkdir(mode=0o777, parents=True, exist_ok=True) + os.chmod(path, 0o777) + return path + + +def driver_identities(okx: bool) -> list[str]: + items = {"trading-system": TS_TLS, "trading-system-jwt": TS_JWT} + if okx: + items.update({"alpha-okx": OKX_TLS, "alpha-okx-jwt": OKX_JWT}) + return ro({f"/identities/{k}": v for k, v in items.items()}) + + +def driver_cmd(name: str, work: Path, code: str, *, okx=False, cpus="1.0", extra=()) -> list[str]: + return ["docker", "run", "--rm", "--name", PREFIX + name, "--label", LABEL, "--network", NETWORK, + "--user", "0:0", "--cap-drop", "ALL", "--cap-add", "DAC_READ_SEARCH", "--read-only", + "--security-opt", "no-new-privileges:true", "--cpus", cpus, "--memory", "1g", + "-e", "PYTHONPATH=/app", *driver_identities(okx), "--mount", f"type=bind,src={work},dst=/work", + *extra, OLD_IMAGE, "python", "-c", code] + + +def start_query(name: str, alias: str, image: str, arm_dir: Path, env: dict, mounts: dict, cmd: list) -> str: + state, probe_dir = arm_dir / "state", writable_dir(arm_dir / "probe") + for path in (state, state / "runtime", state / "shared"): + writable_dir(path) + link = state / "runtime/session-liveness" + if not link.is_symlink(): + link.symlink_to("/session-liveness") + probe_src = arm_dir / "rssprobe" + probe_src.mkdir(mode=0o755, exist_ok=True) + (probe_src / "sitecustomize.py").write_text(harness.PROBE) + os.chmod(probe_src / "sitecustomize.py", 0o644) + env = dict(env) + env.update({ + "QDL_STABLE_REDIS_URL": f"redis://{PREFIX}quota:6379/0", + "QDL_KN3_MARKET_CACHE_URL": f"redis://{PREFIX}cache:6379/0", + "QDL_STABLE_INSTANCE_ID": f"hr-{name}", "QDL_STABLE_CONSUMER_GROUP": f"hr-{name}", + "QDL_STABLE_AUDIT_PATH": "/var/lib/qdl-kn/runtime/hr-query-audit.jsonl", + "PYTHONPATH": "/rssprobe:" + env.get("PYTHONPATH", "/app"), "QDL_RSS_TRACEMALLOC": "0", + }) + env_file = arm_dir / f".env-{name}" + fd = os.open(env_file, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600) + with os.fdopen(fd, "w") as handle: + for key, value in sorted(env.items()): + if "\n" in value: + raise RuntimeError(f"env {key} spans lines") + handle.write(f"{key}={value}\n") + try: + sh("docker", "create", "--rm", "--name", PREFIX + name, "--label", LABEL, "--network", NETWORK, + "--network-alias", alias, "--user", "10001:10001", "--read-only", + "--tmpfs", "/tmp:rw,noexec,nosuid,size=67108864", "--cpus", "1.0", "--memory", "2g", + "--pids-limit", "256", "--security-opt", "no-new-privileges:true", "--cap-drop", "ALL", + "--log-opt", "max-size=50m", "--env-file", str(env_file), *ro(mounts), + "--mount", f"type=bind,src={state},dst=/var/lib/qdl-kn", "--mount", f"type=bind,src={probe_dir},dst=/probe", + "--mount", f"type=bind,src={probe_src},dst=/rssprobe,readonly", image, *cmd) + finally: + env_file.unlink(missing_ok=True) + sh("docker", "start", PREFIX + name) + return PREFIX + name + + +def stop_query(name: str, arm_dir: Path): + logs = subprocess.run(["docker", "logs", "-t", name], capture_output=True, text=True, timeout=120) + (arm_dir / f"{name}.log").write_text(logs.stdout + logs.stderr) + inspect = subprocess.run(["docker", "inspect", "-f", "{{.Image}} {{.RestartCount}} {{.State.OOMKilled}}", name], + capture_output=True, text=True, timeout=30) + (arm_dir / f"{name}.inspect").write_text(inspect.stdout) + sh("docker", "rm", "-f", name, check=False) + + +def wait_file(path: Path, seconds: float): + deadline = time.time() + seconds + while not path.exists(): + if time.time() > deadline: + raise RuntimeError(f"timeout waiting for {path}") + time.sleep(0.5) + + +def slices(products: list) -> list: + ts = [p for p in products if p["consumer"] == TS] + okx = [p for p in products if p["consumer"] == OKX] + out = [{**p, "rows": 1000} for p in ts] + i = 0 + while len(out) < PREREG["burst"]["slices"] and okx: + out.append({**okx[i % len(okx)], "rows": harness.STAGE_ALPHA_ROWS[i % len(harness.STAGE_ALPHA_ROWS)]}) + i += 1 + return out + + +def run_arm(label: str, image: str, output: Path, work_root: Path, env, mounts, cmd, plan, products) -> dict: + arm_dir = output / f"arm-{label}" + arm_dir.mkdir(mode=0o700) + work = writable_dir(work_root / f"arm-{label}") + meta = {"arm": label, "image": image, "started_utc": utc()} + query = start_query(f"q-{label}", "query_v2_1", image, arm_dir, env, mounts, cmd) + hot_reqs = [r for r in plan["ts_r11"] if r["feed"] in ("QUOTE", "TRADE")] + (work / "hot.json").write_text(json.dumps({"url": "https://query_v2_1:8200", "rate_hz": PREREG["hot_reads"]["rate_hz"], + "requirements": hot_reqs})) + burst_slices = slices(products) + meta["slices"] = len(burst_slices) + (work / "burst.json").write_text(json.dumps({"url": "https://query_v2_1:8200", "slices": burst_slices, + **{k: PREREG["burst"][k] for k in ("bursts", "gap_s", "settle_s", "rounds")}})) + probe_dir = arm_dir / "probe" + hot = subprocess.Popen(driver_cmd(f"hot-{label}", work, HOT_DRIVER, cpus="0.5"), + stdout=open(arm_dir / "hot.out", "w"), stderr=subprocess.STDOUT) + burst = None + try: + wait_file(work / "hot-started", 300) + burst = subprocess.Popen(driver_cmd(f"burst-{label}", work, BURST_DRIVER, okx=True, + extra=("--mount", f"type=bind,src={probe_dir},dst=/probe")), + stdout=open(arm_dir / "burst.out", "w"), stderr=subprocess.STDOUT) + time.sleep(60) # pre phase: hot reads without bursts + (work / "go").write_text("1") + burst.wait(timeout=PREREG["burst"]["bursts"] * 200 + 600) + meta["burst_rc"] = burst.returncode + time.sleep(60) # post phase + finally: + (work / "hot-stop").write_text("1") + try: + hot.wait(timeout=120) + except subprocess.TimeoutExpired: + sh("docker", "rm", "-f", PREFIX + f"hot-{label}", check=False) + if burst is not None and burst.poll() is None: + sh("docker", "rm", "-f", PREFIX + f"burst-{label}", check=False) + stop_query(query, arm_dir) + for name in ("hot.jsonl", "events.jsonl"): + if (work / name).exists(): + (arm_dir / name).write_bytes((work / name).read_bytes()) + meta["ended_utc"] = utc() + (arm_dir / "run.json").write_text(json.dumps(meta, indent=1) + "\n") + return meta + + +def run(args) -> int: + require_lock(args.lock_owner) + output = args.output.resolve() + output.mkdir(mode=0o700, parents=True, exist_ok=False) + head = sh("git", "-C", str(ROOT), "rev-parse", "HEAD") + prereg = {**PREREG, "written_utc": utc(), "tool": "scripts/v225_query_hot_read_ab.py", "tool_commit": head, + "tool_sha256": hashlib.sha256(Path(__file__).read_bytes()).hexdigest()} + (output / "prereg.json").write_text(json.dumps(prereg, indent=1) + "\n") + print(json.dumps({"prereg_sha256": hashlib.sha256((output / "prereg.json").read_bytes()).hexdigest()}), flush=True) + env, mounts, cmd = prod_spec() + work_root = writable_dir(output / "work") + bodies = writable_dir(output / "cmp-out" / "bodies") + sync = None + try: + sh("docker", "network", "create", "--internal", "--label", LABEL, NETWORK) + for name, memory, maxmem in (("cache", "1g", "896mb"), ("quota", "128m", "96mb")): + sh("docker", "run", "-d", "--rm", "--name", PREFIX + name, "--label", LABEL, "--network", NETWORK, + "--cpus", "0.5", "--memory", memory, "--read-only", "--tmpfs", "/data:size=64m", REDIS_IMAGE, + "redis-server", "--save", "", "--appendonly", "no", "--maxmemory", maxmem) + plan = json.loads(sh("docker", "run", "--rm", "--network", "none", "--user", "10001:10001", "--read-only", + "--cpus", "0.5", *ro({"/consumer-realms": mounts["/consumer-realms"]}), OLD_IMAGE, + "python", "-c", PLAN)) + (work_root / "plan.json").write_text(json.dumps(plan)) + sh("docker", "create", "--rm", "--name", PREFIX + "sync", "--label", LABEL, "--network", NETWORK, + "--user", "10001:10001", "--read-only", "--cpus", "0.5", "--memory", "512m", "-e", "PYTHONPATH=/app", + "-e", "SRC_URL=redis://market_cache:6379/0", "-e", f"DST_URL=redis://{PREFIX}cache:6379/0", + "-e", "SYNC_DEADLINE_SECONDS=4200", *ro({"/runtime": mounts["/runtime"]}), + "--mount", f"type=bind,src={work_root},dst=/work", OLD_IMAGE, "python", "-c", SYNC) + sh("docker", "network", "connect", PROD_INTERNAL, PREFIX + "sync") + sync = subprocess.Popen(["docker", "start", "-a", PREFIX + "sync"], stdout=open(output / "sync.out", "w"), + stderr=subprocess.STDOUT) + wait_file(work_root / "sync-ready", 900) + products = json.loads((work_root / "products.json").read_text()) + latest = json.loads((work_root / "latest.json").read_text()) + (output / "products.json").write_text(json.dumps({"bars": products, "latest": latest, "copied_utc": utc()}, + indent=1) + "\n") + # 1. byte compare: A and B side by side on the same cache, sync paused per triple + cmp_dir = output / "cmp" + cmp_dir.mkdir(mode=0o700) + qa = start_query("q-cmp-a", "query_v2_1", OLD_IMAGE, cmp_dir, env, mounts, cmd) + qb = start_query("q-cmp-b", "query_v2_2", NEW_IMAGE, cmp_dir, env, mounts, cmd) + (work_root / "cmp.json").write_text(json.dumps({"urls": {"A": "https://query_v2_1:8200", + "B": "https://query_v2_2:8200"}, + "requirements": plan["ts_r11"], "passes": 2})) + try: + cmp_run = subprocess.run(driver_cmd("cmp", work_root, CMP_DRIVER, extra=( + "--mount", f"type=bind,src={bodies.parent},dst=/out")), capture_output=True, text=True, timeout=1800) + (cmp_dir / "driver.out").write_text(cmp_run.stdout[-200000:] + "\n--stderr--\n" + cmp_run.stderr[-20000:]) + finally: + stop_query(qa, cmp_dir) + stop_query(qb, cmp_dir) + # 2. arms: B (new) then A (old) + run_arm("B", NEW_IMAGE, output, work_root, env, mounts, cmd, plan, products) + run_arm("A", OLD_IMAGE, output, work_root, env, mounts, cmd, plan, products) + finally: + (work_root / "stop").write_text("1") + if sync is not None: + try: + sync.wait(timeout=60) + except subprocess.TimeoutExpired: + pass + cleanup(None) + return 0 + + +# ------------------------------------------------------------------------------------------------ analysis +def pct(values: list, q: float): + if not values: + return None + ordered = sorted(values) + return ordered[min(len(ordered) - 1, max(0, int(-(-q * len(ordered) // 1)) - 1))] + + +def summary(rows: list) -> dict: + lat = [r[2] for r in rows if r[3] != "TRANSPORT"] + statuses = {} + for r in rows: + statuses[str(r[3])] = statuses.get(str(r[3]), 0) + 1 + return {"n": len(rows), "statuses": statuses, + "p50_ms": pct(lat, 0.50), "p95_ms": pct(lat, 0.95), "p99_ms": pct(lat, 0.99), "max_ms": max(lat, default=None), + "ok200": {"n": sum(1 for r in rows if r[3] == 200), + "p50_ms": pct([r[2] for r in rows if r[3] == 200], 0.50), + "p95_ms": pct([r[2] for r in rows if r[3] == 200], 0.95), + "p99_ms": pct([r[2] for r in rows if r[3] == 200], 0.99), + "max_ms": max((r[2] for r in rows if r[3] == 200), default=None)}} + + +def maintenance_runs(log_path: Path) -> list: + runs = [] + if not log_path.exists(): + return runs + for line in log_path.read_text().splitlines(): + if '"memory_maintenance"' in line and "qdl.stall" in line: + record = json.loads(line[line.index("{"):]) + run_ms = record["gc_ms"] + record["trim_ms"] + runs.append({**record, "run_ms": round(run_ms, 3), "start_ms": record["wall_ms"] - run_ms, + "end_ms": record["wall_ms"]}) + return runs + + +def arm_summary(arm_dir: Path) -> dict: + rows = [json.loads(line) for line in (arm_dir / "hot.jsonl").read_text().splitlines() if line.strip()] + events = [json.loads(line) for line in (arm_dir / "events.jsonl").read_text().splitlines() if line.strip()] + starts = [e["unix_ms"] for e in events if e["kind"] == "burst_start"] + ends = [e["unix_ms"] for e in events if e["kind"] == "burst_end"] + window = (min(starts), max(ends)) + scored = [r for r in rows if window[0] <= r[1] <= window[1]] + pre = [r for r in rows if r[1] < window[0]] + post = [r for r in rows if r[1] > window[1]] + runs = [r for r in maintenance_runs(next(arm_dir.glob("qdl-hr-q-*.log"), arm_dir / "none"))] + overlap_ids = set() + run_rows = [] + for run in runs: + hits = [i for i, r in enumerate(scored) if r[1] <= run["end_ms"] and r[1] + r[2] >= run["start_ms"]] + overlap_ids.update(hits) + run_rows.append({k: run[k] for k in ("wall_ms", "rss_before_mib", "rss_after_mib", "gc_ms", "trim_ms", + "run_ms", "collected")} + | {"in_scored_window": window[0] <= run["end_ms"] <= window[1] + 5000, + "overlapping_reads": len(hits), + "overlapping_latency_ms": sorted(round(scored[i][2], 1) for i in hits)}) + non_overlap = [r for i, r in enumerate(scored) if i not in overlap_ids] + stats = [e for e in events if e["kind"] == "burst_stats"] + return {"scored_window_ms": window, "pre": summary(pre), "scored": summary(scored), "post": summary(post), + "scored_non_overlap": summary(non_overlap), + "transport_or_5xx": sum(1 for r in scored if r[3] == "TRANSPORT" or (isinstance(r[3], int) and r[3] >= 500)), + "non200_share": (sum(1 for r in scored if r[3] != 200) / len(scored)) if scored else None, + "maintenance_runs": run_rows, + "bursts": [{k: e.get(k) for k in ("burst", "wall_s", "statuses", "failed_slices", "req200_ms_p50", + "rss_mib", "uordblks_mib")} for e in stats], + "schedule_lag_ms_p99": pct([r[1] - r[0] for r in rows], 0.99)} + + +def byte_compare(output: Path) -> dict: + raw = json.loads((output / "cmp-out/byte-compare-raw.json").read_text()) + per_req, problems = {}, [] + for record in raw: + final = record["attempts"][-1] + key = f'{record["index"]:02d}:{record["feed"]}:{record["instrument_uid"]}' + ok = bool(final["valid"]) + checks = { + "valid_triple": final["valid"], + "status_equal": final["A_status"] == final["B_status"], + "content_type_equal": final["A_content_type"] == final["B_content_type"], + "content_length_matches_body": (str(final["A_length"]) == str(final["A_content_length"]) + and str(final["B_length"]) == str(final["B_content_length"])), + "no_transfer_encoding": final["A_transfer_encoding"] is None and final["B_transfer_encoding"] is None, + "a_vs_b_within_volatile": set(final["a_vs_b_paths"]) <= set(final["volatile_paths"]), + "normalized_bytes_equal": final["normalized_equal"], + } + ok = all(checks.values()) + if not ok: + problems.append({"requirement": key, "pass": record["pass"], "failed": [k for k, v in checks.items() if not v]}) + per_req.setdefault(key, []).append({"pass": record["pass"], "attempts": len(record["attempts"]), "ok": ok, + "status": [final["A_status"], final["B_status"]], + "length": [final["A_length"], final["B_length"]], + "content_length": [final["A_content_length"], final["B_content_length"]], + "rows": final["rows"], "volatile_paths": final["volatile_paths"], + "sha256": {"A": final["A_sha256"], "B": final["B_sha256"]}, + "normalized_sha256": final["normalized_sha256"]}) + statuses = {} + for entries in per_req.values(): + for e in entries: + statuses[str(e["status"][0])] = statuses.get(str(e["status"][0]), 0) + 1 + volatile = sorted({p for entries in per_req.values() for e in entries for p in e["volatile_paths"]}) + return {"requirements": len(per_req), "triples": len(raw), "status_counts_A": statuses, + "volatile_paths_seen": volatile, "problems": problems, + "verdict": "PASS" if not problems and len(per_req) == len({r["index"] for r in raw}) else "FAIL", + "per_requirement": per_req} + + +def analyze(args) -> int: + output = args.output.resolve() + prereg = json.loads((output / "prereg.json").read_text()) + a, b = arm_summary(output / "arm-A"), arm_summary(output / "arm-B") + sa, sb = a["scored"], b["scored"] + rules = {} + rules["HR1"] = {"p95": [sa["p95_ms"], sb["p95_ms"], max(1.10 * sa["p95_ms"], sa["p95_ms"] + 10)], + "p99": [sa["p99_ms"], sb["p99_ms"], max(1.10 * sa["p99_ms"], sa["p99_ms"] + 25)]} + rules["HR1"]["pass"] = (sb["p95_ms"] <= rules["HR1"]["p95"][2] and sb["p99_ms"] <= rules["HR1"]["p99"][2]) + covered = [r for r in b["maintenance_runs"] if r["in_scored_window"] and r["overlapping_reads"] > 0] + rules["HR2"] = {"runs_total": len(b["maintenance_runs"]), "runs_covered": len(covered), "pass": bool(covered)} + bound_extra = b["scored_non_overlap"]["p99_ms"] + 50 + hr3 = all(max(r["overlapping_latency_ms"], default=0) <= r["run_ms"] + bound_extra and r["run_ms"] <= 500 + for r in b["maintenance_runs"]) + rules["HR3"] = {"bound_extra_ms": bound_extra, "pass": hr3 and bool(b["maintenance_runs"])} + allowed = a["transport_or_5xx"] + max(2, 0.005 * sb["n"]) + rules["HR4"] = {"A": a["transport_or_5xx"], "B": b["transport_or_5xx"], "allowed": allowed, + "pass": b["transport_or_5xx"] <= allowed} + rules["HR5"] = {"A": a["non200_share"], "B": b["non200_share"], "pass": b["non200_share"] <= a["non200_share"] + 0.01} + bc = byte_compare(output) + rules["BC"] = {"verdict": bc["verdict"], "problems": bc["problems"], "pass": bc["verdict"] == "PASS"} + if not rules["HR2"]["pass"]: + verdict = "INCONCLUSIVE" + else: + verdict = "PASS" if all(rules[k]["pass"] for k in ("HR1", "HR2", "HR3", "HR4", "HR5", "BC")) else "FAIL" + receipt = {"schema": "qdl.v225.query-ab-receipt.v1", "verdict": verdict, "rules": rules, + "prereg_sha256": hashlib.sha256((output / "prereg.json").read_bytes()).hexdigest(), + "prereg_written_utc": prereg["written_utc"], "tool_commit": prereg["tool_commit"], + "arms": {"A_old": {"image": OLD_IMAGE, **a}, "B_new": {"image": NEW_IMAGE, **b}}, + "products": json.loads((output / "products.json").read_text()) if (output / "products.json").exists() else None, + "analyzed_utc": utc()} + (output / "receipt.json").write_text(json.dumps(receipt, indent=1, default=str) + "\n") + (output / "byte-compare.json").write_text(json.dumps({"schema": "qdl.v225.query-warmup-byte-compare.v1", + "old_image": OLD_IMAGE, "new_image": NEW_IMAGE, "manifest": "trading-system.paper.stable r11", + "prereg_rule": PREREG["rules"]["BC"], "prereg_sha256": receipt["prereg_sha256"], **bc}, indent=1) + "\n") + print(json.dumps({"verdict": verdict, **{k: v["pass"] for k, v in rules.items()}, + "A": {k: sa[k] for k in ("n", "p50_ms", "p95_ms", "p99_ms", "max_ms")}, + "B": {k: sb[k] for k in ("n", "p50_ms", "p95_ms", "p99_ms", "max_ms")}, + "maintenance_B": b["maintenance_runs"], "bc": bc["verdict"], "bc_problems": bc["problems"][:5]}, + indent=1, default=str)) + return 0 + + +def cleanup(_args) -> int: + names = [n for n in sh("docker", "ps", "-a", "--filter", f"label={LABEL}", "--format", "{{.Names}}", + check=False).splitlines() if n.startswith(PREFIX)] + for name in names: + sh("docker", "rm", "-f", name, check=False) + nets = [n for n in sh("docker", "network", "ls", "--filter", f"label={LABEL}", "--format", "{{.Name}}", + check=False).splitlines() if n == NETWORK] + for net in nets: + sh("docker", "network", "rm", net, check=False) + print(json.dumps({"removed_containers": names, "removed_networks": nets}), flush=True) + return 0 + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + sub = parser.add_subparsers(dest="command", required=True) + p = sub.add_parser("run") + p.add_argument("--output", type=Path, required=True) + p.add_argument("--lock-owner", default="claude-v225-query-ab") + p.set_defaults(func=run) + p = sub.add_parser("analyze") + p.add_argument("--output", type=Path, required=True) + p.set_defaults(func=analyze) + p = sub.add_parser("cleanup") + p.set_defaults(func=cleanup) + args = parser.parse_args() + return args.func(args) + + +if __name__ == "__main__": + sys.exit(main()) From 0bba638525ee0f3353196add403a39db3fc8a59b Mon Sep 17 00:00:00 2001 From: BobbyAxerol Date: Tue, 20 Oct 2026 04:50:30 +0000 Subject: [PATCH 3/9] v2.2.5 Query A/B harness: prereg v2 (owner 04:30Z) - concurrent with a foreign correctness lock, interleaved A1 B1 A2 B2, paired-delta rules, foreign activity sampling Changed before any run; v1 (7d28d9cb) was never executed. --- scripts/v225_query_hot_read_ab.py | 157 +++++++++++++++++++++++------- 1 file changed, 120 insertions(+), 37 deletions(-) diff --git a/scripts/v225_query_hot_read_ab.py b/scripts/v225_query_hot_read_ab.py index a1fd38c6..ff51e141 100644 --- a/scripts/v225_query_hot_read_ab.py +++ b/scripts/v225_query_hot_read_ab.py @@ -15,12 +15,16 @@ Boundary: production is read-only. The only production contact is a read-only copy of market-cache keys (DUMP/HMGET/HGETALL, the IDR-129 harness method) by the ``sync`` container and ``docker inspect`` of query_kn_1 for its container spec. Every container is ``--rm``, CPU-capped, on one ``--internal`` network (prefix ``qdl-hr-``, -label ``qdl.v225.hotread=true``); ``cleanup`` removes all of them and the network. Needs the host measurement lock -(AGENTS.md 34a) held by ``--lock-owner``. TS identity = the new mesh generation (root-only files, so the drivers +label ``qdl.v225.hotread=true``); ``cleanup`` removes all of them and the network. Host lock: by the owner's +instruction of 2026-10-20 ~04:30Z this session runs CONCURRENTLY with another agent's correctness-only lock +(``--concurrent``): the lock file is never written or removed, foreign activity (other containers, load, CPU PSI, +the lock content) is sampled every 30 s into ``foreign.jsonl``, and the arms are interleaved (A1 B1 A2 B2) so the +rules are judged on paired old-vs-new deltas, not on absolute numbers. Without ``--concurrent`` the lock must be +held by ``--lock-owner``. TS identity = the new mesh generation (root-only files, so the drivers run as root with DAC_READ_SEARCH only); alpha-okx identity = its phase105b client certificate (still trusted). Usage (host python): - v225_query_hot_read_ab.py run --output DIR [--lock-owner O] + v225_query_hot_read_ab.py run --output DIR [--lock-owner O | --concurrent] v225_query_hot_read_ab.py analyze --output DIR v225_query_hot_read_ab.py cleanup """ @@ -61,11 +65,15 @@ OKX = "alpha.okx.paper.stable" PREREG = { - "schema": "qdl.v225.query-ab-prereg.v1", + "schema": "qdl.v225.query-ab-prereg.v2", + "revision_note": ("v2 (before any run) replaces v1 of commit 7d28d9cb: owner 2026-10-20 ~04:30Z: run concurrently " + "with a foreign correctness-only lock, interleave arms, judge paired old-vs-new deltas, record " + "foreign activity"), "images": {"A_old": OLD_IMAGE, "B_new": NEW_IMAGE}, "replica": "one Query replica per arm, production container spec of query_kn_1 except private cache/quota Redis, --cpus 1.0 --memory 2g (the IDR-129 arm shape)", - "order": "byte compare (A and B side by side), then arm B, then arm A", - "burst": {"slices": 64, "bursts": 12, "gap_s": 10, "settle_s": 5, "rounds": 4, + "order": "byte compare (A and B side by side), then interleaved arms A1 B1 A2 B2 (A = old, B = new), each a fresh replica", + "concurrency": "runs beside another agent's correctness-only job under its host lock (owner instruction); foreign activity sampled every 30 s", + "burst": {"slices": 64, "bursts": 6, "gap_s": 10, "settle_s": 5, "rounds": 4, "mix": "TS r11 BAR 1m x 1,000 rows (10 slices) + alpha-okx BAR 1m..1h cycled to 54 slices with rows " "2500/5000/2500/5000/2500/5000/2500/10000 (the IDR-129 stage ladder); SDK 2.4 redirect/queued " "retry shape", @@ -78,11 +86,11 @@ "phases": "pre (60 s before burst 1), scored (first burst start .. last burst end), post (60 s)"}, "maintenance": "the new image's default QDL_QUERY_MEMORY_SOFT_LIMIT_MIB (448); no manual gc/trim in any scored arm", "rules": { - "HR1": "scored hot reads (any HTTP status; transport errors counted apart): p95_B <= max(1.10*p95_A, p95_A+10 ms) and p99_B <= max(1.10*p99_A, p99_A+25 ms)", - "HR2": "coverage: arm B has >= 1 memory_maintenance run inside its scored window with >= 1 hot read overlapping it; otherwise INCONCLUSIVE (never PASS)", - "HR3": "bounded pause: every hot read overlapping a maintenance run has latency <= run_ms + p99 of B's non-overlapping scored reads + 50 ms, and every run_ms <= 500", - "HR4": "transport errors + HTTP 5xx in B <= A + max(2, 0.5 % of B's scored reads)", - "HR5": "non-200 share of scored reads in B <= A + 1 percentage point", + "HR1": "paired deltas over the pairs (A1,B1) and (A2,B2), scored hot reads (any HTTP status; transport errors counted apart): mean(p95_Bi - p95_Ai) <= max(0.10*mean(p95_Ai), 10 ms) and mean(p99_Bi - p99_Ai) <= max(0.10*mean(p99_Ai), 25 ms); each pair is reported", + "HR2": "coverage: the B arms together have >= 1 memory_maintenance run inside a scored window with >= 1 hot read overlapping it; otherwise INCONCLUSIVE (never PASS)", + "HR3": "bounded pause: every hot read overlapping a maintenance run has latency <= run_ms + p99 of that arm's non-overlapping scored reads + 50 ms, and every run_ms <= 500", + "HR4": "transport errors + HTTP 5xx summed over B arms <= summed over A arms + max(2, 0.5 % of the B arms' scored reads)", + "HR5": "non-200 share of scored reads over the B arms <= over the A arms + 1 percentage point", "BC": "for every TS r11 requirement, in each of 2 passes, a valid triple (A, B, A' = second request to A, issued " "together with the sync paused) exists within 3 attempts; valid = A and A' differ only in scalar leaves " "(V); PASS when for every valid triple: status A == B, content-type A == B, Content-Length header == body " @@ -712,12 +720,54 @@ def run_arm(label: str, image: str, output: Path, work_root: Path, env, mounts, return meta +def foreign_sample() -> dict: + names = sh("docker", "ps", "--format", "{{.Names}}|{{.Status}}", check=False).splitlines() + ours = [n for n in names if n.startswith(PREFIX)] + sample = {"utc": utc(), "unix_ms": time.time_ns() / 1e6, "loadavg": Path("/proc/loadavg").read_text().strip(), + "running_containers": len(names), "ours": len(ours), + "foreign_test_like": sorted(n.split("|")[0] for n in names if not n.startswith(PREFIX) + and not n.startswith(STACK) and not n.startswith(("market_data_service", + "portal", "monitor")))} + for kind in ("cpu", "memory", "io"): + try: + sample[f"psi_{kind}"] = Path(f"/proc/pressure/{kind}").read_text().splitlines()[0] + except OSError: + pass + try: + sample["lock"] = json.loads(LOCK.read_text()) + except (OSError, ValueError): + sample["lock"] = None + return sample + + +def sampler(path: Path, stop) -> None: + with open(path, "a") as handle: + while not stop.is_set(): + try: + handle.write(json.dumps(foreign_sample()) + "\n") + handle.flush() + except Exception as error: # sampling never breaks the run + handle.write(json.dumps({"utc": utc(), "sampler_error": type(error).__name__}) + "\n") + stop.wait(30) + + def run(args) -> int: - require_lock(args.lock_owner) + import threading + if args.concurrent: + try: + lock = json.loads(LOCK.read_text()) + except (OSError, ValueError): + lock = None + print(json.dumps({"concurrent_with_lock": lock}), flush=True) + else: + require_lock(args.lock_owner) output = args.output.resolve() output.mkdir(mode=0o700, parents=True, exist_ok=False) + stop_sampler = threading.Event() + threading.Thread(target=sampler, args=(output / "foreign.jsonl", stop_sampler), daemon=True).start() head = sh("git", "-C", str(ROOT), "rev-parse", "HEAD") prereg = {**PREREG, "written_utc": utc(), "tool": "scripts/v225_query_hot_read_ab.py", "tool_commit": head, + "concurrent_mode": bool(args.concurrent), "tool_sha256": hashlib.sha256(Path(__file__).read_bytes()).hexdigest()} (output / "prereg.json").write_text(json.dumps(prereg, indent=1) + "\n") print(json.dumps({"prereg_sha256": hashlib.sha256((output / "prereg.json").read_bytes()).hexdigest()}), flush=True) @@ -763,10 +813,11 @@ def run(args) -> int: finally: stop_query(qa, cmp_dir) stop_query(qb, cmp_dir) - # 2. arms: B (new) then A (old) - run_arm("B", NEW_IMAGE, output, work_root, env, mounts, cmd, plan, products) - run_arm("A", OLD_IMAGE, output, work_root, env, mounts, cmd, plan, products) + # 2. interleaved arms (paired deltas): A1 B1 A2 B2 + for label, image in (("A1", OLD_IMAGE), ("B1", NEW_IMAGE), ("A2", OLD_IMAGE), ("B2", NEW_IMAGE)): + run_arm(label, image, output, work_root, env, mounts, cmd, plan, products) finally: + stop_sampler.set() (work_root / "stop").write_text("1") if sync is not None: try: @@ -774,6 +825,8 @@ def run(args) -> int: except subprocess.TimeoutExpired: pass cleanup(None) + with open(output / "foreign.jsonl", "a") as handle: + handle.write(json.dumps({**foreign_sample(), "phase": "after_cleanup"}) + "\n") return 0 @@ -885,43 +938,71 @@ def byte_compare(output: Path) -> dict: def analyze(args) -> int: output = args.output.resolve() prereg = json.loads((output / "prereg.json").read_text()) - a, b = arm_summary(output / "arm-A"), arm_summary(output / "arm-B") - sa, sb = a["scored"], b["scored"] + arms = {label: arm_summary(output / f"arm-{label}") for label in ("A1", "B1", "A2", "B2")} + pairs = [("A1", "B1"), ("A2", "B2")] rules = {} - rules["HR1"] = {"p95": [sa["p95_ms"], sb["p95_ms"], max(1.10 * sa["p95_ms"], sa["p95_ms"] + 10)], - "p99": [sa["p99_ms"], sb["p99_ms"], max(1.10 * sa["p99_ms"], sa["p99_ms"] + 25)]} - rules["HR1"]["pass"] = (sb["p95_ms"] <= rules["HR1"]["p95"][2] and sb["p99_ms"] <= rules["HR1"]["p99"][2]) - covered = [r for r in b["maintenance_runs"] if r["in_scored_window"] and r["overlapping_reads"] > 0] - rules["HR2"] = {"runs_total": len(b["maintenance_runs"]), "runs_covered": len(covered), "pass": bool(covered)} - bound_extra = b["scored_non_overlap"]["p99_ms"] + 50 - hr3 = all(max(r["overlapping_latency_ms"], default=0) <= r["run_ms"] + bound_extra and r["run_ms"] <= 500 - for r in b["maintenance_runs"]) - rules["HR3"] = {"bound_extra_ms": bound_extra, "pass": hr3 and bool(b["maintenance_runs"])} - allowed = a["transport_or_5xx"] + max(2, 0.005 * sb["n"]) - rules["HR4"] = {"A": a["transport_or_5xx"], "B": b["transport_or_5xx"], "allowed": allowed, - "pass": b["transport_or_5xx"] <= allowed} - rules["HR5"] = {"A": a["non200_share"], "B": b["non200_share"], "pass": b["non200_share"] <= a["non200_share"] + 0.01} + per_pair = [{"pair": [a, b], + "p95": [arms[a]["scored"]["p95_ms"], arms[b]["scored"]["p95_ms"]], + "p99": [arms[a]["scored"]["p99_ms"], arms[b]["scored"]["p99_ms"]], + "p50": [arms[a]["scored"]["p50_ms"], arms[b]["scored"]["p50_ms"]], + "max": [arms[a]["scored"]["max_ms"], arms[b]["scored"]["max_ms"]], + "d_p95": arms[b]["scored"]["p95_ms"] - arms[a]["scored"]["p95_ms"], + "d_p99": arms[b]["scored"]["p99_ms"] - arms[a]["scored"]["p99_ms"]} for a, b in pairs] + mean = lambda xs: sum(xs) / len(xs) + d95, d99 = mean([p["d_p95"] for p in per_pair]), mean([p["d_p99"] for p in per_pair]) + a95, a99 = mean([p["p95"][0] for p in per_pair]), mean([p["p99"][0] for p in per_pair]) + rules["HR1"] = {"pairs": per_pair, "mean_d_p95": d95, "bound_p95": max(0.10 * a95, 10.0), + "mean_d_p99": d99, "bound_p99": max(0.10 * a99, 25.0)} + rules["HR1"]["pass"] = d95 <= rules["HR1"]["bound_p95"] and d99 <= rules["HR1"]["bound_p99"] + b_runs = [dict(r, arm=label) for label in ("B1", "B2") for r in arms[label]["maintenance_runs"]] + covered = [r for r in b_runs if r["in_scored_window"] and r["overlapping_reads"] > 0] + rules["HR2"] = {"runs_total": len(b_runs), "runs_covered": len(covered), "pass": bool(covered)} + hr3 = [] + for label in ("B1", "B2"): + extra = arms[label]["scored_non_overlap"]["p99_ms"] + 50 + for r in arms[label]["maintenance_runs"]: + worst = max(r["overlapping_latency_ms"], default=0) + hr3.append({"arm": label, "run_ms": r["run_ms"], "worst_overlapping_ms": worst, "bound_ms": r["run_ms"] + extra, + "pass": worst <= r["run_ms"] + extra and r["run_ms"] <= 500}) + rules["HR3"] = {"runs": hr3, "pass": bool(hr3) and all(x["pass"] for x in hr3)} + errs = {g: sum(arms[l]["transport_or_5xx"] for l in labels) for g, labels in (("A", ("A1", "A2")), ("B", ("B1", "B2")))} + n_b = sum(arms[l]["scored"]["n"] for l in ("B1", "B2")) + allowed = errs["A"] + max(2, 0.005 * n_b) + rules["HR4"] = {**errs, "allowed": allowed, "pass": errs["B"] <= allowed} + def share(labels): + n = sum(arms[l]["scored"]["n"] for l in labels) + bad = sum(arms[l]["non200_share"] * arms[l]["scored"]["n"] for l in labels) + return bad / n if n else None + rules["HR5"] = {"A": share(("A1", "A2")), "B": share(("B1", "B2"))} + rules["HR5"]["pass"] = rules["HR5"]["B"] <= rules["HR5"]["A"] + 0.01 bc = byte_compare(output) rules["BC"] = {"verdict": bc["verdict"], "problems": bc["problems"], "pass": bc["verdict"] == "PASS"} if not rules["HR2"]["pass"]: verdict = "INCONCLUSIVE" else: verdict = "PASS" if all(rules[k]["pass"] for k in ("HR1", "HR2", "HR3", "HR4", "HR5", "BC")) else "FAIL" - receipt = {"schema": "qdl.v225.query-ab-receipt.v1", "verdict": verdict, "rules": rules, + foreign = [json.loads(line) for line in (output / "foreign.jsonl").read_text().splitlines() if line.strip()] \ + if (output / "foreign.jsonl").exists() else [] + loads = [float(x["loadavg"].split()[0]) for x in foreign if "loadavg" in x] + psi = [float(x["psi_cpu"].split("avg10=")[1].split()[0]) for x in foreign if "psi_cpu" in x] + concurrency = {"mode": "CONCURRENT_WITH_FOREIGN_LOCK" if prereg.get("concurrent_mode") else "EXCLUSIVE_LOCK", + "samples": len(foreign), "load1_min_max": [min(loads, default=None), max(loads, default=None)], + "psi_cpu_some_avg10_min_max": [min(psi, default=None), max(psi, default=None)], + "locks_seen": sorted({json.dumps(x.get("lock"), sort_keys=True) for x in foreign}), + "foreign_test_like_containers_seen": sorted({n for x in foreign for n in x.get("foreign_test_like", [])})} + receipt = {"schema": "qdl.v225.query-ab-receipt.v2", "verdict": verdict, "rules": rules, "concurrency": concurrency, "prereg_sha256": hashlib.sha256((output / "prereg.json").read_bytes()).hexdigest(), "prereg_written_utc": prereg["written_utc"], "tool_commit": prereg["tool_commit"], - "arms": {"A_old": {"image": OLD_IMAGE, **a}, "B_new": {"image": NEW_IMAGE, **b}}, + "arms": {label: {"image": OLD_IMAGE if label.startswith("A") else NEW_IMAGE, **arms[label]} for label in arms}, "products": json.loads((output / "products.json").read_text()) if (output / "products.json").exists() else None, "analyzed_utc": utc()} (output / "receipt.json").write_text(json.dumps(receipt, indent=1, default=str) + "\n") (output / "byte-compare.json").write_text(json.dumps({"schema": "qdl.v225.query-warmup-byte-compare.v1", "old_image": OLD_IMAGE, "new_image": NEW_IMAGE, "manifest": "trading-system.paper.stable r11", "prereg_rule": PREREG["rules"]["BC"], "prereg_sha256": receipt["prereg_sha256"], **bc}, indent=1) + "\n") - print(json.dumps({"verdict": verdict, **{k: v["pass"] for k, v in rules.items()}, - "A": {k: sa[k] for k in ("n", "p50_ms", "p95_ms", "p99_ms", "max_ms")}, - "B": {k: sb[k] for k in ("n", "p50_ms", "p95_ms", "p99_ms", "max_ms")}, - "maintenance_B": b["maintenance_runs"], "bc": bc["verdict"], "bc_problems": bc["problems"][:5]}, - indent=1, default=str)) + print(json.dumps({"verdict": verdict, **{k: v["pass"] for k, v in rules.items()}, "HR1": rules["HR1"], + "maintenance_B": b_runs, "bc": bc["verdict"], "bc_problems": bc["problems"][:5], + "concurrency": concurrency}, indent=1, default=str)) return 0 @@ -944,6 +1025,8 @@ def main() -> int: p = sub.add_parser("run") p.add_argument("--output", type=Path, required=True) p.add_argument("--lock-owner", default="claude-v225-query-ab") + p.add_argument("--concurrent", action="store_true", + help="owner-instructed run beside another agent's correctness-only lock (never touches the lock)") p.set_defaults(func=run) p = sub.add_parser("analyze") p.add_argument("--output", type=Path, required=True) From 8a0cdd1eef03790405d88681949028beb91872b7 Mon Sep 17 00:00:00 2001 From: BobbyAxerol Date: Tue, 20 Oct 2026 05:02:34 +0000 Subject: [PATCH 4/9] v2.2.5 Query A/B harness: keep nested binds of the production Query spec (new-generation client CA bundle) Attempt 1 (2026-10-20 04:50Z) dropped /consumer-realms/query-client-ca-bundle.crt, so the isolated replicas refused the new TS client certificate; nothing was measured. Rules unchanged. --- scripts/v225_query_hot_read_ab.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/v225_query_hot_read_ab.py b/scripts/v225_query_hot_read_ab.py index ff51e141..0889cb31 100644 --- a/scripts/v225_query_hot_read_ab.py +++ b/scripts/v225_query_hot_read_ab.py @@ -576,8 +576,11 @@ def require_lock(owner: str): def prod_spec(): raw = json.loads(sh("docker", "inspect", PROD_QUERY))[0] - mounts = {m["Destination"]: m["Source"] for m in raw["Mounts"] if m["Destination"] in MOUNTS} - if set(mounts) != set(MOUNTS): + # nested binds count too: the v2.2.5 compose binds the new generation's query-client-ca-bundle.crt inside + # /consumer-realms (attempt 1 of 2026-10-20 dropped it and the replica refused the new TS client certificate) + mounts = {m["Destination"]: m["Source"] for m in raw["Mounts"] + if m["Destination"] in MOUNTS or any(m["Destination"].startswith(top + "/") for top in MOUNTS)} + if not set(MOUNTS) <= set(mounts): raise RuntimeError(f"production Query mounts differ: {sorted(mounts)}") env = dict(item.split("=", 1) for item in raw["Config"]["Env"]) return env, mounts, raw["Config"]["Cmd"] From 543ddf1810713b198713549f669bd93e4ea996df Mon Sep 17 00:00:00 2001 From: BobbyAxerol Date: Tue, 20 Oct 2026 05:04:09 +0000 Subject: [PATCH 5/9] v2.2.5 Query A/B harness: honour volume subpaths of the production Query spec (/session-liveness) Attempt 2 (05:02Z) bound the stable_state volume root, so every latest read was DATA_STALE (SESSION_STATE) on both images; stopped after 3 requirements, not scored. Rules unchanged. --- scripts/v225_query_hot_read_ab.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/scripts/v225_query_hot_read_ab.py b/scripts/v225_query_hot_read_ab.py index 0889cb31..626388f5 100644 --- a/scripts/v225_query_hot_read_ab.py +++ b/scripts/v225_query_hot_read_ab.py @@ -580,6 +580,12 @@ def prod_spec(): # /consumer-realms (attempt 1 of 2026-10-20 dropped it and the replica refused the new TS client certificate) mounts = {m["Destination"]: m["Source"] for m in raw["Mounts"] if m["Destination"] in MOUNTS or any(m["Destination"].startswith(top + "/") for top in MOUNTS)} + # a volume mount with a subpath (v2.2.5 compose: /session-liveness = stable_state:runtime/session-liveness) shows + # only the volume root in .Mounts; attempt 2 bound the root and every QUOTE/TRADE read was SESSION_STATE stale + for spec in raw["HostConfig"].get("Mounts") or []: + subpath = (spec.get("VolumeOptions") or {}).get("Subpath") + if subpath and spec.get("Target") in mounts: + mounts[spec["Target"]] = mounts[spec["Target"]].rstrip("/") + "/" + subpath if not set(MOUNTS) <= set(mounts): raise RuntimeError(f"production Query mounts differ: {sorted(mounts)}") env = dict(item.split("=", 1) for item in raw["Config"]["Env"]) From b5b36e7272de06bc5e230d22eef7c96e64bf0374 Mon Sep 17 00:00:00 2001 From: BobbyAxerol Date: Tue, 20 Oct 2026 05:16:27 +0000 Subject: [PATCH 6/9] v2.2.5 Query A/B harness: path-exact BC masking in the analysis; compare-only rerun mode Attempt 3's BC driver could not write its raw record (/out not writable for the capped root driver); the per-requirement statuses survive in cmp/driver.out, the bodies by sha. The BC phase is re-run in the same session dir after the arms. The analysis now masks the raw token at each volatile path exactly, as the pre-registered BC rule states (the driver skipped small integers such as per-request ages). Rules unchanged. --- scripts/v225_query_hot_read_ab.py | 77 +++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/scripts/v225_query_hot_read_ab.py b/scripts/v225_query_hot_read_ab.py index 626388f5..1d7113b8 100644 --- a/scripts/v225_query_hot_read_ab.py +++ b/scripts/v225_query_hot_read_ab.py @@ -771,17 +771,26 @@ def run(args) -> int: else: require_lock(args.lock_owner) output = args.output.resolve() - output.mkdir(mode=0o700, parents=True, exist_ok=False) + compare_only = bool(getattr(args, "compare_only", False)) + output.mkdir(mode=0o700, parents=True, exist_ok=compare_only) stop_sampler = threading.Event() threading.Thread(target=sampler, args=(output / "foreign.jsonl", stop_sampler), daemon=True).start() head = sh("git", "-C", str(ROOT), "rev-parse", "HEAD") prereg = {**PREREG, "written_utc": utc(), "tool": "scripts/v225_query_hot_read_ab.py", "tool_commit": head, "concurrent_mode": bool(args.concurrent), "tool_sha256": hashlib.sha256(Path(__file__).read_bytes()).hexdigest()} - (output / "prereg.json").write_text(json.dumps(prereg, indent=1) + "\n") + if compare_only: + # re-run of the BC phase in the session dir of the arms (the first BC output was lost: /out not writable) + if not (output / "prereg.json").exists(): + raise SystemExit("compare-only needs the session's prereg.json") + (output / "compare-rerun.json").write_text(json.dumps({**prereg, "rerun_reason": args.compare_only_reason}, + indent=1) + "\n") + else: + (output / "prereg.json").write_text(json.dumps(prereg, indent=1) + "\n") print(json.dumps({"prereg_sha256": hashlib.sha256((output / "prereg.json").read_bytes()).hexdigest()}), flush=True) env, mounts, cmd = prod_spec() - work_root = writable_dir(output / "work") + work_root = writable_dir(output / ("work-cmp-rerun" if compare_only else "work")) + writable_dir(output / "cmp-out") bodies = writable_dir(output / "cmp-out" / "bodies") sync = None try: @@ -808,7 +817,7 @@ def run(args) -> int: (output / "products.json").write_text(json.dumps({"bars": products, "latest": latest, "copied_utc": utc()}, indent=1) + "\n") # 1. byte compare: A and B side by side on the same cache, sync paused per triple - cmp_dir = output / "cmp" + cmp_dir = output / ("cmp-rerun" if compare_only else "cmp") cmp_dir.mkdir(mode=0o700) qa = start_query("q-cmp-a", "query_v2_1", OLD_IMAGE, cmp_dir, env, mounts, cmd) qb = start_query("q-cmp-b", "query_v2_2", NEW_IMAGE, cmp_dir, env, mounts, cmd) @@ -823,7 +832,7 @@ def run(args) -> int: stop_query(qa, cmp_dir) stop_query(qb, cmp_dir) # 2. interleaved arms (paired deltas): A1 B1 A2 B2 - for label, image in (("A1", OLD_IMAGE), ("B1", NEW_IMAGE), ("A2", OLD_IMAGE), ("B2", NEW_IMAGE)): + for label, image in (() if compare_only else (("A1", OLD_IMAGE), ("B1", NEW_IMAGE), ("A2", OLD_IMAGE), ("B2", NEW_IMAGE))): run_arm(label, image, output, work_root, env, mounts, cmd, plan, products) finally: stop_sampler.set() @@ -906,8 +915,64 @@ def arm_summary(arm_dir: Path) -> dict: "schedule_lag_ms_p99": pct([r[1] - r[0] for r in rows], 0.99)} +_TOKEN = None + + +def raw_mask(raw: bytes, paths: set) -> bytes: + """Replace the raw JSON scalar token at each path in ``paths`` by ``""`` (path-exact, bytes elsewhere kept). + + The BC rule masks the values at the volatile paths V only; a global value replace would also hit equal numbers + elsewhere (the driver's own mask therefore skipped small integers, which made per-request age fields unmasked). + """ + import re + global _TOKEN + if _TOKEN is None: + _TOKEN = re.compile(rb'"(?:[^"\\]|\\.)*"|-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?|true|false|null|[{}\[\]:,]|\s+') + out, pos, stack = [], 0, [] # stack items: ["obj", key, expecting_key] or ["arr", index] + for match in _TOKEN.finditer(raw): + token = match.group() + if token[:1].isspace(): + continue + if token in (b"{", b"["): + stack.append(["obj", None, True] if token == b"{" else ["arr", 0]) + continue + if token in (b"}", b"]"): + stack.pop() + continue + if token == b":": + stack[-1][2] = False + continue + if token == b",": + if stack and stack[-1][0] == "obj": + stack[-1][2] = True + elif stack: + stack[-1][1] += 1 + continue + if stack and stack[-1][0] == "obj" and stack[-1][2]: + stack[-1][1] = json.loads(token) + continue + path = tuple(item[1] for item in stack) + if path in paths: + out.append(raw[pos:match.start()]) + out.append(b'""') + pos = match.end() + out.append(raw[pos:]) + return b"".join(out) + + def byte_compare(output: Path) -> dict: + import ast raw = json.loads((output / "cmp-out/byte-compare-raw.json").read_text()) + bodies = output / "cmp-out/bodies" + for record in raw: + final = record["attempts"][-1] + paths = {ast.literal_eval(p) for p in final["volatile_paths"] if p.startswith("(")} + a = (bodies / f'{final["A_sha256"]}.json').read_bytes() + b = (bodies / f'{final["B_sha256"]}.json').read_bytes() + na, nb = raw_mask(a, paths), raw_mask(b, paths) + final["driver_string_mask_equal"] = final["normalized_equal"] + final["normalized_equal"] = na == nb + final["normalized_sha256"] = {"A": hashlib.sha256(na).hexdigest(), "B": hashlib.sha256(nb).hexdigest()} per_req, problems = {}, [] for record in raw: final = record["attempts"][-1] @@ -1036,6 +1101,8 @@ def main() -> int: p.add_argument("--lock-owner", default="claude-v225-query-ab") p.add_argument("--concurrent", action="store_true", help="owner-instructed run beside another agent's correctness-only lock (never touches the lock)") + p.add_argument("--compare-only", action="store_true", help="re-run only the BC phase inside an existing session dir") + p.add_argument("--compare-only-reason", default="") p.set_defaults(func=run) p = sub.add_parser("analyze") p.add_argument("--output", type=Path, required=True) From 7952b22745fee8116dca4291714240c7ff960e31 Mon Sep 17 00:00:00 2001 From: BobbyAxerol Date: Tue, 20 Oct 2026 05:53:37 +0000 Subject: [PATCH 7/9] v2.2.5: G5 D3 (b) measured by the isolated Query A/B; DR warmup byte compare; certificate PASS without P1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Session query-ab-20261020c (2026-10-20 05:04-05:50Z, owner "Đo luôn rồi tag", run beside other agents' jobs by owner instruction, arms interleaved A1 B1 A2 B2): verdict PASS. Hot reads (TS EXECUTION QUOTE/TRADE snapshots, 10/s) during 64-warmup bursts: paired mean d_p95 -41.9 ms, d_p99 -19.5 ms; maintenance runs 131/147 ms covered; non-200 equal. - Warmup byte compare old 3e9e4d3a vs new 753604f8, 65 TS r11 requirements x 2 passes: byte-identical outside per-request paths (byte-compare.json 41ebcc3c). - Certificate, endpoint report, release notes, scope header, ledger and plan updated; P1 superseded (never used). Harness analysis compacted; unit tests for masking/percentiles. --- CERTIFICATION_LEDGER.md | 26 + DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md | 44 + scripts/v225_query_hot_read_ab.py | 7 +- tests/test_v225_query_hot_read_ab.py | 49 + .../evidence/releases/v2.2.5/CERTIFICATE.md | 87 +- .../releases/v2.2.5/CERTIFICATE_SCOPE.md | 4 +- .../evidence/releases/v2.2.5/RELEASE_NOTES.md | 11 +- .../evidence/releases/v2.2.5/certificate.json | 117 +- .../releases/v2.2.5/endpoint-report.json | 144 +- .../v2.2.5/query-ab-20261020/SHA256SUMS | 20 + .../query-ab-20261020/byte-compare.json | 4525 +++++++++++++++++ .../query-ab-20261020/compare-rerun.json | 45 + .../v2.2.5/query-ab-20261020/foreign.jsonl | 93 + .../v2.2.5/query-ab-20261020/prereg.json | 44 + .../v2.2.5/query-ab-20261020/receipt.json | 2742 ++++++++++ 15 files changed, 7863 insertions(+), 95 deletions(-) create mode 100644 tests/test_v225_query_hot_read_ab.py create mode 100644 upgrade/evidence/releases/v2.2.5/query-ab-20261020/SHA256SUMS create mode 100644 upgrade/evidence/releases/v2.2.5/query-ab-20261020/byte-compare.json create mode 100644 upgrade/evidence/releases/v2.2.5/query-ab-20261020/compare-rerun.json create mode 100644 upgrade/evidence/releases/v2.2.5/query-ab-20261020/foreign.jsonl create mode 100644 upgrade/evidence/releases/v2.2.5/query-ab-20261020/prereg.json create mode 100644 upgrade/evidence/releases/v2.2.5/query-ab-20261020/receipt.json diff --git a/CERTIFICATION_LEDGER.md b/CERTIFICATION_LEDGER.md index 76f2e984..91c9d2d1 100644 --- a/CERTIFICATION_LEDGER.md +++ b/CERTIFICATION_LEDGER.md @@ -2405,3 +2405,29 @@ Pinned at: as NOT_MEASURED. `gates_without_p1` G5 NOT_MEASURED. **Owner confirmation of P1 is required before the tag**; the alternative is the isolated hot-read A/B. - SDK 2.4.1 wheel `9f79e032...` (same as v2.2.4, rebuilt byte-identical). `release.yml` unchanged. No tag. + +### 2026-10-20 - Query A/B (G5 D3 (b) hot reads + DR warmup byte compare): CERTIFIED (isolated); v2.2.5 certificate PASS without P1 + +Pinned at: +- old Query `sha256:3e9e4d3a...` (v2.2.4), new Query `sha256:753604f8...` (v2.2.5); harness + `scripts/v225_query_hot_read_ab.py` with PREREG v2 committed at `0bba6385` before the run (session tool `543ddf18`, + BC re-run `b5b36e72`); one replica per arm at 1 vCPU / 2 GiB, private read-only copy of the market cache. + +- Owner 2026-10-20: "Đo luôn rồi tag" (measure, then tag), then (~04:30Z) run without waiting for the foreign + correctness-only lock, interleave arms, judge paired deltas, record foreign activity. Session + `~/.local/state/qdl-v2/releases/v2.2.5/query-ab-20261020c` 05:04-05:50Z: verdict **PASS** + (`query-ab-20261020/receipt.json` `d3899b22...`). + - Hot reads (TS EXECUTION QUOTE/TRADE snapshots, open loop 10/s) during 6 x 64-warmup bursts per arm, A1 B1 A2 B2: + p95 186.0 / 122.9 / 173.1 / 152.4 ms, p99 437.8 / 391.7 / 399.4 / 406.6 ms; paired mean d_p95 -41.9 ms, d_p99 + -19.5 ms (bounds +18.0 / +41.9). + - New image maintenance runs 131 / 147 ms inside the scored windows; overlapping reads 7.9 / 44.7 ms. + - Non-200 only 503 DATA_NOT_READY (HNX TRADE without a latest entry), 5.1 % vs 5.0 %. + - Concurrency: other agents' test containers running, no lock file present, load1 8.2-13.3. +- DR warmup byte compare: 65 TS r11 requirements x 2 passes, 130 valid triples; status, content-type and + Content-Length equal; bodies byte-identical after masking the per-request paths that also differ between two + requests to the same old replica. `byte-compare.json` `41ebcc3c575e3fb1cb37ee069cd5eff156bb0ed7ef0dd4b0b5becc51e22ae7e4` + PASS. +- Not counted: attempts 1 (04:50Z, nested client-CA bind dropped) and 2 (05:02Z, volume subpath ignored) measured + nothing. +- Certificate re-issued: G5 PASS by complete delta proof; P1 superseded (never used); `gates_without_a5` keeps G11 + FAIL as in v2.2.4. Re-run only if either Query image, the warmup/snapshot code path or the TS r11 manifest changes. diff --git a/DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md b/DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md index bf74e645..fd08aef1 100644 --- a/DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md +++ b/DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md @@ -77081,3 +77081,47 @@ locally; release image NOT rebuilt (the coordinator rebuilds rust together with NOT tagged. Open: owner confirmation of P1 (or the hot-read A/B under the host lock), W14 (TS read:packages token), old-identity cleanup approval, PR CI. Next: PR into dev (coordinator merges), then the dev -> main release PR; the coordinator creates the tag. + +### DL v2.2.5: G5 D3 (b) measured by an isolated Query A/B; DR warmup byte compare; P1 superseded - 2026-10-20 (Claude) + +- Owner via the coordinator: option (b) "Đo luôn rồi tag". At ~04:30Z the owner also said: do not wait for the + Codex lock, because it is correctness only. Run concurrently, interleave the arms, judge on paired old-vs-new + deltas, record foreign activity, and touch nothing of theirs. +- Waiting: from 03:49Z I queued an acquire behind the Codex lock. Codex extended that lock twice, to 05:14:50Z. The + acquire was stopped at 04:49Z on the owner instruction, after which no lock was taken or touched by me. The lock + file was absent during the counted session. +- Tool: `scripts/v225_query_hot_read_ab.py` (new; reuses the IDR-129 harness probe). + - PREREG v1 `7d28d9cb` was never run. PREREG v2 `0bba6385` is the concurrent, interleaved, paired version and was + committed before any run. + - Rules: + - HR1: paired mean d_p95 <= max(10 % of A, 10 ms); paired mean d_p99 <= max(10 % of A, 25 ms). + - HR2: >= 1 maintenance run overlapped by reads; if not, the verdict is INCONCLUSIVE. + - HR3: overlapping reads <= run + p99 + 50 ms. + - HR4: transport and 5xx errors on B no higher than A beyond the prereg allowance. + - HR5: non-200 share on B <= A + 1 pp. + - BC: A/B/A' triples. + - Fixes during the session, rules unchanged: + - `543ddf18`: keep nested binds and volume subpaths of the production Query spec. Attempts 1 and 2 measured + nothing. + - `b5b36e72`: compare-only re-run mode and path-exact masking in the analysis. The BC driver could not write its + raw record, so the BC phase was re-run in the same session after the arms. +- Result (session `query-ab-20261020c`, 05:04-05:50Z): **PASS**. + - Paired mean d_p95 -41.9 ms, d_p99 -19.5 ms. + - Maintenance runs 131 / 147 ms; 2 overlapping reads. + - 503 DATA_NOT_READY 5.1 % vs 5.0 %. + - BC: 65/65 requirements x 2 passes, byte-identical outside the per-request paths (request_id, stream_cursor, + per-row cursor, freshness_ms, provider_session_liveness_ms). + - Receipts are in `upgrade/evidence/releases/v2.2.5/query-ab-20261020/` (`SHA256SUMS`). `byte-compare.json` + `41ebcc3c...` is the DR delta-proof input for TS. +- Certificate re-issued: G5 PASS by complete delta proof; P1 removed and recorded as superseded. Updated: + - `CERTIFICATE.md` + - `certificate.json` + - `endpoint-report.json` + - `RELEASE_NOTES.md` + - `CERTIFICATE_SCOPE.md` header + - `CERTIFICATION_LEDGER.md` +- Cleanup: every `qdl-hr-*` container (`--rm`) and network `qdl-hr-net` removed; 0 left (`docker ps -a` / `network + ls` by label). No image was built. Production was read-only: docker inspect, the read-only cache copy and + docker logs. +- Status: v2.2.5 certificate PASS, not tagged. Next: PR #48 CI and merge (coordinator), then the dev -> main + release PR. diff --git a/scripts/v225_query_hot_read_ab.py b/scripts/v225_query_hot_read_ab.py index 1d7113b8..d2d49635 100644 --- a/scripts/v225_query_hot_read_ab.py +++ b/scripts/v225_query_hot_read_ab.py @@ -995,14 +995,17 @@ def byte_compare(output: Path) -> dict: "status": [final["A_status"], final["B_status"]], "length": [final["A_length"], final["B_length"]], "content_length": [final["A_content_length"], final["B_content_length"]], - "rows": final["rows"], "volatile_paths": final["volatile_paths"], + "rows": final["rows"], + "volatile_path_count": len(final["volatile_paths"]), + "volatile_path_patterns": sorted({__import__("re").sub(r", \d+", ", *", v) + for v in final["volatile_paths"]}), "sha256": {"A": final["A_sha256"], "B": final["B_sha256"]}, "normalized_sha256": final["normalized_sha256"]}) statuses = {} for entries in per_req.values(): for e in entries: statuses[str(e["status"][0])] = statuses.get(str(e["status"][0]), 0) + 1 - volatile = sorted({p for entries in per_req.values() for e in entries for p in e["volatile_paths"]}) + volatile = sorted({p for entries in per_req.values() for e in entries for p in e["volatile_path_patterns"]}) return {"requirements": len(per_req), "triples": len(raw), "status_counts_A": statuses, "volatile_paths_seen": volatile, "problems": problems, "verdict": "PASS" if not problems and len(per_req) == len({r["index"] for r in raw}) else "FAIL", diff --git a/tests/test_v225_query_hot_read_ab.py b/tests/test_v225_query_hot_read_ab.py new file mode 100644 index 00000000..dec33f9c --- /dev/null +++ b/tests/test_v225_query_hot_read_ab.py @@ -0,0 +1,49 @@ +"""scripts/v225_query_hot_read_ab.py: the pure analysis rules (path-exact masking, percentiles, prereg shape). + +The session itself needs Docker and production read access (run once, receipts in +upgrade/evidence/releases/v2.2.5/query-ab-20261020/); here the parts that decide the verdict are proven. +""" +from __future__ import annotations + +import importlib.util +from pathlib import Path +import unittest + +ROOT = Path(__file__).resolve().parents[1] +SPEC = importlib.util.spec_from_file_location("v225_query_hot_read_ab", ROOT / "scripts/v225_query_hot_read_ab.py") +tool = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(tool) + + +class RawMaskTest(unittest.TestCase): + def test_only_the_named_paths_are_masked(self): + a = b'{"request_id":"x1","data":[{"q":{"f":2240,"g":5},"c":"c1"},{"q":{"f":7,"g":5}}],"n":2240}' + b = b'{"request_id":"y22","data":[{"q":{"f":2242,"g":5},"c":"c2"},{"q":{"f":8,"g":5}}],"n":2240}' + paths = {("request_id",), ("data", 0, "q", "f"), ("data", 0, "c"), ("data", 1, "q", "f")} + self.assertEqual(tool.raw_mask(a, paths), + b'{"request_id":"","data":[{"q":{"f":"","g":5},"c":""},{"q":{"f":"","g":5}}],"n":2240}') + self.assertEqual(tool.raw_mask(a, paths), tool.raw_mask(b, paths)) + + def test_a_difference_outside_the_paths_stays_visible(self): + a = b'{"request_id":"x1","data":[{"p":"1.0"}]}' + b = b'{"request_id":"y2","data":[{"p":"1.1"}]}' + self.assertNotEqual(tool.raw_mask(a, {("request_id",)}), tool.raw_mask(b, {("request_id",)})) + + def test_escaped_strings_and_whitespace(self): + self.assertEqual(tool.raw_mask(b'{"a": "s\\"x", "b": [1, 2]}', {("b", 1)}), b'{"a": "s\\"x", "b": [1, ""]}') + + +class RulesTest(unittest.TestCase): + def test_nearest_rank_percentile(self): + self.assertEqual(tool.pct(list(range(1, 101)), 0.99), 99) + self.assertEqual(tool.pct(list(range(1, 11)), 0.95), 10) + self.assertIsNone(tool.pct([], 0.5)) + + def test_prereg_names_both_images_and_every_rule(self): + self.assertEqual(set(tool.PREREG["images"].values()), {tool.OLD_IMAGE, tool.NEW_IMAGE}) + self.assertTrue({"HR1", "HR2", "HR3", "HR4", "HR5", "BC", "verdict"} <= set(tool.PREREG["rules"])) + self.assertIn("INCONCLUSIVE", tool.PREREG["rules"]["verdict"]) + + +if __name__ == "__main__": + unittest.main() diff --git a/upgrade/evidence/releases/v2.2.5/CERTIFICATE.md b/upgrade/evidence/releases/v2.2.5/CERTIFICATE.md index 0e84f44e..d18d3106 100644 --- a/upgrade/evidence/releases/v2.2.5/CERTIFICATE.md +++ b/upgrade/evidence/releases/v2.2.5/CERTIFICATE.md @@ -1,9 +1,10 @@ # Quant Data Layer v2.2.5 - scoped release certificate -Status: **PASS under P1 (POST_HOC_PACKAGING_DECISION, see section 4), which needs the owner's confirmation before the -tag.** Without P1, G5 is NOT_MEASURED under the item that `CERTIFICATE_SCOPE.md` fixed before the window, and the -certificate would not be PASS. Both readings are kept side by side (`certificate.json` `gates` / -`gates_without_p1`), as v2.2.4 did for A5. NOT TAGGED, NOT PUBLISHED. +Status: **PASS. NOT TAGGED, NOT PUBLISHED.** G5's predeclared delta item D3 (b) "concurrent hot-read latency" was +measured on 2026-10-20 in an isolated, pre-registered A/B of the old and new Query images (section 4, +[query-ab-20261020/](query-ab-20261020/)), so no post-hoc decision is needed. The certificate's first issue +(PR #48 head `e3a17cd8`) carried a packaging proposal P1 that would have scoped that item out; the owner chose to +measure instead ("Đo luôn rồi tag"), and P1 is **superseded**, not used. Issued 2026-10-20 after the production maintenance window of 2026-10-20 01:28-02:54Z (coordinator-run, owner GO). v2.2.5 is a compact release: configuration, container definitions, mesh certificates, and the Query python image with @@ -23,9 +24,9 @@ Companion files: [RELEASE_NOTES.md](RELEASE_NOTES.md), [endpoint-report.json](en on delta proof D3 (a)-(d); "a missing item of (b) is NOT_MEASURED and blocks the G5 claim". R1, R2, R3 and R4 must PASS. - Carried from v2.2.4 section 1: no gate FAIL; a NOT_MEASURED item is never upgraded; required CI green on the PR head. -- `status` is `PASS` only when all hold. Section 4 shows that one predeclared item (D3 (b) concurrent hot-read latency) - is missing; PASS therefore rests on P1. That is a post-measurement change of how G5 is scoped, made at packaging, - and is labelled as such everywhere. +- `status` is `PASS` only when all hold. They hold (section 4); the D3 (b) item rests on the A/B whose pass rules were + committed before it ran (`scripts/v225_query_hot_read_ab.py` PREREG v2, commit `0bba6385`; written into + `query-ab-20261020/prereg.json` `0f2f00b4...` at the start of the counted session). ## 2. Identity @@ -75,6 +76,7 @@ digests. | IDR-127 semantic parity | [semantic-parity.json](semantic-parity.json) | `0d8e3a3bbc0096691b10cfc0a172779968f5dc68bdc7f301cc00492b536b4861` | | Inherited certificate / endpoint report / scorecard | `../v2.2.4/certificate.json`, `endpoint-report.json`, `scorecard.json` | `42412548...`, `013b66e6...`, `2dc2f8d1...` | | Inherited G12/G13 | `../v2.2.4/g12-g13-inheritance.json` | `95088c9c...` | +| Query A/B (D3 (b) hot reads + DR warmup byte compare), pre-registered | [query-ab-20261020/](query-ab-20261020/): `prereg.json`, `receipt.json`, `byte-compare.json`, `foreign.jsonl`, `compare-rerun.json`; raw files (hot reads, Query logs, bodies) under `~/.local/state/qdl-v2/releases/v2.2.5/query-ab-20261020c/` | `SHA256SUMS` in that folder; receipt `d3899b22...`, byte compare `41ebcc3c575e3fb1cb37ee069cd5eff156bb0ed7ef0dd4b0b5becc51e22ae7e4` | | Endpoint report | [endpoint-report.json](endpoint-report.json) | in certificate.json `endpoint_report_sha256` | ## 4. Gates @@ -87,7 +89,7 @@ G12/G13 receipts), pinned by sha256 in `certificate.json` `inherited`. | --- | --- | --- | | G1-G3 transit | INHERITED PASS | rust binaries unchanged; regression R1 + R4 PASS; the Query-served parts are G5/G6 | | G4 per-row delivery | INHERITED PASS | same; under G4-A1, G4-A2, A3 as in v2.2.4 | -| G5 request latency | **PASS under P1; NOT_MEASURED without P1** | below | +| G5 request latency | **PASS (delta proof complete, incl. D3 (b) measured)** | below | | G6 execution eligibility | PASS (delta proof) | D3 (a): the IDR-129 diff (`qdl/api_v2/router.py` warmup response slicing, `qdl/query/service.py` refused-item frame release + `large_warmup_lane_busy`, `qdl/runtime/memory_maintenance.py`, `qdl/runtime/stable.py` install) touches no eligibility, freshness or policy code; IDR-129 tests 12 OK on its PR; production execution-ready 53 after STRICT = pre-window baseline 53 (R4 range 48-53 over 59 samples, READY 64/64 in all) | | G7-G10 integrity, lossless TRADE, cursor, ordering | INHERITED PASS | rehearsal offset/cursor continuity in every phase; R1 URP 0, under-min-ISR 0, core 3 members, projector lag back (277 / 56) | | G11 recovery | INHERITED: PASS under A5, **FAIL without A5** (as v2.2.4) | not re-run; the window measured recovery: outage 545 s, STRICT READY 64/64 | @@ -100,30 +102,61 @@ G12/G13 receipts), pinned by sha256 in `certificate.json` `inherited`. | D3 item | Result | | --- | --- | | (a) IDR-129 tests incl. failed/cancelled requests; rows, limits, order unchanged | PASS (PR #46: `tests/test_query_idr129_memory.py` 12 OK, negative control fails on the unfixed service; affected suites 552 tests, 1 environment failure explained in the plan) | -| (b) isolated A/B on a production-volume private cache copy, 3e9e4d3a vs fixed image, 12 x 64-warmup bursts, no manual gc/trim in the scored arms | **RSS**: 472 -> 683 MiB (max 743.7) before vs 361 -> 445 MiB after (plateau). **Warmup latency** (200s, p50 per burst): 6.4-8.7 s vs 6.6-8.3 s. **429 per burst**: 992-1135 vs 991-1118. **Failed slices per burst** (harness at 1 vCPU, queue-dominated, both arms): 27-37 vs 26-35. **Concurrent hot-read latency: NOT_MEASURED** (the harness drives warmups only). Arm H ran image 84512ab; its four IDR-129 files equal the released 9b6747f (`git diff` empty) | +| (b) isolated A/B on a production-volume private cache copy, 3e9e4d3a vs fixed image, 12 x 64-warmup bursts, no manual gc/trim in the scored arms | **RSS**: 472 -> 683 MiB (max 743.7) before vs 361 -> 445 MiB after (plateau). **Warmup latency** (200s, p50 per burst): 6.4-8.7 s vs 6.6-8.3 s. **429 per burst**: 992-1135 vs 991-1118. **Failed slices per burst** (harness at 1 vCPU, queue-dominated, both arms): 27-37 vs 26-35. Arm H ran image 84512ab; its four IDR-129 files equal the released 9b6747f (`git diff` empty). **Concurrent hot-read latency: measured 2026-10-20, PASS** (below) | | (c) final rehearsal 64-warmup burst on the window configuration | PASS (3 bursts, baseline 133.4, peaks 160-172, settled 156.8 MiB; near-zero row volume) | | (d) build receipt | PASS (above) | | Window | Query max 188.3 MiB during both writer starts; R4 plateau 260-277 MiB, 0 restarts; R4 request latency QUOTE n=7261 p50 <=10 / p95 <=25 / p99 <=25 ms, TRADE n=1800 p50 <=25 / p95 <=25 / p99 <=50 ms (writer native_probe, basis `QUERY_REQUEST_START_TO_REDIS_APPLY_DECISION_MONOTONIC`; a different clock from the v2.2.4 G5 classes, so it is a regression sample, not a G5 re-measurement) | -**P1 (POST_HOC_PACKAGING_DECISION, 2026-10-20, Claude; requires owner confirmation).** G5 is split by code path: -- G5-hot (the v2.2.4 stage-50 per-class p95/p99 of hot reads): the request path of hot reads is unchanged by the - IDR-129 diff (it changes warmup responses, refused batch items and adds a maintenance hook). The only new code - that can run on the event loop beside a hot read is the memory maintenance, which runs only when RSS >= 448 MiB - (`QDL_QUERY_MEMORY_SOFT_LIMIT_MIB`), the large-warmup lane is idle >= 3 s and >= 120 s passed since the last run. - In production after the window it ran **0 times** (`docker logs --since 2026-10-20T01:33:00Z` of query_kn_1/2, - grep `kind=memory_maintenance`, 0 and 0; RSS 228 / 234 MiB at 03:00Z). G5-hot is therefore INHERITED PASS. -- G5-cold (warmup shapes): PASS by D3 (b) RSS, latency and 429 rows above. -- G5-maintenance (hot-read latency while a maintenance run executes): **NOT_MEASURED**, stated as a limit. What is - measured: each run blocks the replica's event loop for 136-160 ms (arm H at 1 vCPU: gc 128-152 ms + trim 8-12 ms), - at most once per 120 s per replica. A hot read on that replica that overlaps a run waits up to that long. This is a - bound from measured durations, not a latency measurement under load. - -Without P1, the predeclared rule makes G5 NOT_MEASURED and the status not PASS. To remove P1: run the isolated -A/B with a concurrent hot-read driver (both images, under the host lock), or have the owner accept P1. +**D3 (b) concurrent hot-read latency (2026-10-20 05:04-05:50Z, `query-ab-20261020/receipt.json`: verdict PASS).** +- Shape: one Query replica per arm (production query_kn_1 spec incl. nested binds and volume subpaths, private cache + and quota Redis, `--cpus 1.0 --memory 2g`); a read-only private copy of the market cache (40 BAR products with + 10,000 rows, 54 of the 55 TS r11 latest products, kept fresh by a read-only sync every 0.5 s); arms interleaved + A1 B1 A2 B2 (A = 3e9e4d3a, B = 753604f8), each 6 x 64-warmup bursts (TS BAR 1m x 1,000 + alpha-okx BAR ladder up + to 10,000 rows); an open-loop hot-read driver at 10/s (4x the production rate) of TS EXECUTION QUOTE/TRADE + snapshots, the request of the TS writer. No manual gc/trim in any arm. +- Scored hot reads (sent between the first burst start and the last burst end, any status): + +| Arm | n | p50 ms | p95 ms | p99 ms | max ms | burst RSS MiB | maintenance runs | +| --- | --- | --- | --- | --- | --- | --- | --- | +| A1 old | 3972 | 17.3 | 186.0 | 437.8 | 787.9 | 464-608 | - | +| B1 new | 3750 | 16.8 | 122.9 | 391.7 | 738.4 | 370-450 | 1 (131 ms) | +| A2 old | 3609 | 17.3 | 173.1 | 399.4 | 837.2 | 465-678 | - | +| B2 new | 3830 | 16.9 | 152.4 | 406.6 | 761.4 | 381-436 | 1 (147 ms) | + +- Paired deltas (new - old): p95 -63.1 / -20.7 ms (mean -41.9, bound +18.0); p99 -46.1 / +7.2 ms (mean -19.5, bound + +41.9): HR1 PASS. Maintenance runs 131 ms and 147 ms (gc 121/131 + trim 10/16 ms), both inside the scored windows; + 2 hot reads overlapped the B1 run (7.9 and 44.7 ms, bound 572 ms), 0 overlapped the B2 run: HR2 and HR3 PASS. + Non-200 = 503 DATA_NOT_READY only (the TS TRADE product HNX VN-derivatives `d0ac3d4c...`, which had no latest + entry in the production cache at copy time, and brief QUOTE not-ready moments), 5.1 % old vs 5.0 % new: HR4 and HR5 PASS. +- The tails (p95 120-190 ms, p99 390-440 ms) are those of one 1-vCPU replica under back-to-back 64-warmup bursts, + equal for both images; outside the bursts (pre phase) p95 was 9.5-9.8 ms on both. These are A/B numbers, not a + production latency claim. +- Concurrency (owner instruction 2026-10-20 ~04:30Z): run without the host lock, beside other agents' test containers + (control-api / contracts / ts35 test containers seen; no lock file was present during the session), host load1 + 8.2-13.3, CPU PSI some avg10 1.3-7.7 %. That is why arms were interleaved and judged on paired deltas. +- Session record: attempts 1 (04:50Z: nested client-CA bind dropped, the replicas refused the new TS identity) and 2 + (05:02Z: volume subpath ignored, every latest read SESSION_STATE stale) measured nothing and were stopped; harness + fixed (`543ddf18`), rules unchanged. In attempt 3 the byte compare's raw record could not be written (permission), + so that phase was re-run in the same session after the arms (`compare-rerun.json`, harness `b5b36e72`). + +**DR warmup byte compare (same session, `query-ab-20261020/byte-compare.json` `41ebcc3c...`): PASS.** All 65 TS +manifest r11 requirements, 2 passes, 130 triples (A old, B new, A' second request to A, issued together with the +sync paused), every triple valid at the first attempt: +- status equal on every triple (128 x 200, 2 x 503 DATA_NOT_READY for that HNX TRADE product on both images); + content-type equal; `Content-Length` equals the body length on both images; no `Transfer-Encoding` (the new + image's sliced warmup body keeps one `Content-Length`); +- old and new differ only at paths that also differ between two requests to the same old replica (`request_id`, + `stream_cursor`, per-row `cursor`, `quality.freshness_ms`, `quality.provider_session_liveness_ms`), and the + bodies are byte-identical after masking exactly those values (10 BAR 1m x 1,000 rows each included). + +**P1 superseded.** The first issue of this certificate proposed P1 (scope D3 (b) out as NOT_MEASURED). It is not +part of this certificate; the measurement above replaced it. ## 5. Limits stated by this certificate -1. **P1 is post hoc** (section 4): G5 is PASS only with the G5-maintenance item recorded as NOT_MEASURED. +1. **The D3 (b) A/B is an isolated comparison**, not production latency: one 1-vCPU replica, a private cache copy, + 10 reads/s, run beside other agents' test containers without the host lock (owner instruction), judged on paired + old-vs-new deltas. 2. **Supported load (IDR-128 OPEN, owner decision 2026-10-19 ~18:00Z).** The inherited latency envelope was measured with unrelated heavy stacks paused (15 portal containers, Codex tree stopped); a mixed portal workload on the same host is outside the certified scope. The window and the R4 soak ran with the portal **running** and Codex @@ -162,5 +195,5 @@ keys, consumer realm dir r16, bar edge image and checkpoint, V1 rollback contain - `certificate.json` `status` is `PASS`; the endpoint report sha256 in it equals the file; RELEASE_NOTES.md exists; the SDK wheel is the byte-identical 2.4.1 build. `release.yml` is unchanged. -- Still required before a tag: the owner's confirmation of P1 (or the hot-read A/B); required CI green on the PR - heads; the release head on `origin/main`. The coordinator creates the tag. +- Still required before a tag: required CI green on the PR heads; the release head on `origin/main`. The coordinator + creates the tag. diff --git a/upgrade/evidence/releases/v2.2.5/CERTIFICATE_SCOPE.md b/upgrade/evidence/releases/v2.2.5/CERTIFICATE_SCOPE.md index fdeb6af0..dd6fc868 100644 --- a/upgrade/evidence/releases/v2.2.5/CERTIFICATE_SCOPE.md +++ b/upgrade/evidence/releases/v2.2.5/CERTIFICATE_SCOPE.md @@ -1,8 +1,8 @@ # Data Layer v2.2.5 certificate scope Status: applied. This was the DRAFT proposal used for the window; the issued certificate is `CERTIFICATE.md` / -`certificate.json` (same folder), which records where the evidence met, or did not meet, each item below -(notably D3 (b) "concurrent hot-read latency": NOT_MEASURED, see `CERTIFICATE.md` section 4). +`certificate.json` (same folder), which records how the evidence met each item below (D3 (b) "concurrent hot-read +latency" by the pre-registered A/B of 2026-10-20, `query-ab-20261020/`, see `CERTIFICATE.md` section 4). v2.2.5 is a compact release (owner 2026-10-19 ~09:00Z: "phải gọn lại"; TS is the main work). It changes configuration, container definitions, the mesh certificates and the Query python image (IDR-127 configuration files diff --git a/upgrade/evidence/releases/v2.2.5/RELEASE_NOTES.md b/upgrade/evidence/releases/v2.2.5/RELEASE_NOTES.md index e46a5996..ae8c09cc 100644 --- a/upgrade/evidence/releases/v2.2.5/RELEASE_NOTES.md +++ b/upgrade/evidence/releases/v2.2.5/RELEASE_NOTES.md @@ -2,8 +2,10 @@ Compact release: configuration, container definitions, mesh certificates and one Query fix. No Rust binary changed. Deployed to production in the maintenance window of 2026-10-20 (01:28-02:54Z, forward path, no rollback). -Certificate: [CERTIFICATE.md](CERTIFICATE.md) / [certificate.json](certificate.json): **PASS under P1**, a post-hoc -packaging decision on how G5 is scoped that the owner must confirm before the tag (CERTIFICATE.md section 4). +Certificate: [CERTIFICATE.md](CERTIFICATE.md) / [certificate.json](certificate.json): **PASS**. G5 includes the +pre-registered isolated A/B of old vs new Query (hot reads during warmup bursts and memory-maintenance runs: paired +p95/p99 deltas -41.9 / -19.5 ms; warmup responses byte-identical for all 65 TS r11 requirements outside per-request +fields), [query-ab-20261020/](query-ab-20261020/). ## Contents @@ -49,8 +51,9 @@ SDK: `qdl-sdk 2.4.1`, the same wheel as v2.2.4 (`9f79e032...`, byte-identical re ## Limits -- **P1 / G5**: hot-read latency while a Query memory-maintenance run executes is NOT_MEASURED (each run blocks that - replica's loop 136-160 ms; it ran 0 times in production after the window). Owner confirmation needed. +- The G5 A/B is isolated (one 1-vCPU replica, private cache copy, beside other agents' test containers) and judged on + paired deltas; it is not a production latency figure. A maintenance run blocks its replica's loop ~130-150 ms, at + most once per 120 s and only above 448 MiB RSS (it ran 0 times in production after the window). - **Supported load (IDR-128 OPEN)**: the inherited latency envelope was measured with unrelated heavy stacks paused; a mixed portal workload on the same host is outside the certified scope. The window ran with the portal running. - Inherited from v2.2.4: G11 PASS only under post-hoc A5; G14 CPU above budget (not a gate); IDR-108 open. diff --git a/upgrade/evidence/releases/v2.2.5/certificate.json b/upgrade/evidence/releases/v2.2.5/certificate.json index 7ec088a9..fffb9cae 100644 --- a/upgrade/evidence/releases/v2.2.5/certificate.json +++ b/upgrade/evidence/releases/v2.2.5/certificate.json @@ -3,23 +3,12 @@ "release": "v2.2.5", "previous_published_release": "v2.2.4", "status": "PASS", - "status_basis": "PASS under P1 (POST_HOC_PACKAGING_DECISION 2026-10-20, Claude; requires the owner's confirmation before the tag): G5 split by code path; G5-hot INHERITED (hot-read request path unchanged; the new maintenance hook ran 0 times in production), G5-cold PASS by the IDR-129 A/B, G5-maintenance (hot reads concurrent with a maintenance run) NOT_MEASURED and stated as a limit. Without P1 the predeclared CERTIFICATE_SCOPE.md D3 (b) item makes G5 NOT_MEASURED and the status not PASS (gates_without_p1).", - "post_hoc_decisions": [ - { - "id": "P1", - "label": "POST_HOC_PACKAGING_DECISION", - "made": "2026-10-20 at packaging, after the window receipts", - "by": "Claude (packager); owner confirmation required", - "owner_confirmed": false, - "predeclared_item": "CERTIFICATE_SCOPE.md D3 (b) 'concurrent hot-read latency' (a missing item of (b) is NOT_MEASURED and blocks the G5 claim)", - "what_exists": "RSS, warmup latency, 429 and failed-slice counts per burst for both images; maintenance run durations 136-160 ms (gc 128-152 + trim 8-12, arm H at 1 vCPU); 0 production maintenance runs after the window", - "to_remove": "isolated A/B with a concurrent hot-read driver, 3e9e4d3a vs 753604f8, under the host lock; or the owner accepts P1" - } - ], - "status_rule": "PASS only with no FAIL gate, every inherited gate's delta proof met, R1/R2/R3/R4 PASS, no NOT_MEASURED item upgraded, and required CI green on the PR head (CERTIFICATE.md section 1; inheritance matrix fixed before the window in CERTIFICATE_SCOPE.md). P1 is a post-measurement scoping of G5 and is NOT a predeclared rule.", - "classification": "SCOPED_DATA_LAYER_CONFIG_CERT_QUERY_DELTA_RELEASE_INHERITING_V224_GATES_PASS_UNDER_POST_HOC_P1_SINGLE_HOST_NOT_HA", - "publication_status": "NOT_TAGGED_CERTIFICATE_PASS_UNDER_POST_HOC_P1", - "publication_requires": "owner confirmation of P1 (or the hot-read A/B); required CI green on the PR heads; the release head on origin/main (release.yml merge-base check); the coordinator creates the tag; release.yml is unchanged and accepts status PASS", + "status_basis": "PASS: every gate inherited from v2.2.4 with its delta proof, or measured; G5 delta proof D3 (a)-(d) complete, D3 (b) concurrent hot-read latency measured by the pre-registered isolated A/B of 2026-10-20 (query-ab-20261020, verdict PASS: paired p95/p99 deltas new-old mean -41.9 / -19.5 ms; 2 maintenance runs 131/147 ms inside the scored windows; DR warmup byte compare PASS 65/65)", + "post_hoc_decisions": [], + "status_rule": "PASS only with no FAIL gate, every inherited gate's delta proof met, R1/R2/R3/R4 PASS, no NOT_MEASURED item upgraded, and required CI green on the PR head (CERTIFICATE.md section 1; inheritance matrix fixed before the window in CERTIFICATE_SCOPE.md).", + "classification": "SCOPED_DATA_LAYER_CONFIG_CERT_QUERY_DELTA_RELEASE_INHERITING_V224_GATES_PASS_SINGLE_HOST_NOT_HA", + "publication_status": "NOT_TAGGED_CERTIFICATE_PASS", + "publication_requires": "required CI green on the PR heads; the release head on origin/main (release.yml merge-base check); the coordinator creates the tag; release.yml is unchanged and accepts status PASS", "scope": "configuration (IDR-127), versioned KN compose + healthchecks, mesh mTLS generation 20261019T084200Z, Query python image with the IDR-129 fix; rust digests unchanged; TS writer unchanged (W12-A)", "window": { "executed": "2026-10-20T01:28Z-02:54:45Z", @@ -169,23 +158,7 @@ "G2": "INHERITED_PASS", "G3": "INHERITED_PASS", "G4": "INHERITED_PASS", - "G5": "PASS_UNDER_P1", - "G6": "PASS", - "G7": "INHERITED_PASS", - "G8": "INHERITED_PASS", - "G9": "INHERITED_PASS", - "G10": "INHERITED_PASS", - "G11": "INHERITED_PASS_UNDER_A5", - "G12": "INHERITED_PASS", - "G13": "INHERITED_PASS", - "G14": "INHERITED_PASS" - }, - "gates_without_p1": { - "G1": "INHERITED_PASS", - "G2": "INHERITED_PASS", - "G3": "INHERITED_PASS", - "G4": "INHERITED_PASS", - "G5": "NOT_MEASURED", + "G5": "PASS", "G6": "PASS", "G7": "INHERITED_PASS", "G8": "INHERITED_PASS", @@ -196,25 +169,9 @@ "G13": "INHERITED_PASS", "G14": "INHERITED_PASS" }, - "gates_without_p1_and_a5": { - "G1": "INHERITED_PASS", - "G2": "INHERITED_PASS", - "G3": "INHERITED_PASS", - "G4": "INHERITED_PASS", - "G5": "NOT_MEASURED", - "G6": "PASS", - "G7": "INHERITED_PASS", - "G8": "INHERITED_PASS", - "G9": "INHERITED_PASS", - "G10": "INHERITED_PASS", - "G11": "FAIL", - "G12": "INHERITED_PASS", - "G13": "INHERITED_PASS", - "G14": "INHERITED_PASS" - }, "gate_basis": { "G1-G4": "INHERITED v2.2.4 counted run; regression R1 + R4 PASS", - "G5": "PASS under P1: G5-hot inherited (request path unchanged, maintenance ran 0 times in production), G5-cold PASS by the IDR-129 A/B (RSS 361-445 vs 472-743 MiB, warmup p50 6.6-8.3 vs 6.4-8.7 s, 429 991-1118 vs 992-1135 per burst), G5-maintenance NOT_MEASURED", + "G5": "PASS by delta proof: (a) IDR-129 tests; (b) isolated A/B 3e9e4d3a vs fixed image: RSS 361-445 vs 472-743 MiB, warmup p50 6.6-8.3 vs 6.4-8.7 s, 429 991-1118 vs 992-1135 per burst, and concurrent hot-read latency (query-ab-20261020: paired mean d_p95 -41.9 ms, d_p99 -19.5 ms; maintenance runs covered); (c) rehearsal burst; (d) build receipt", "G6": "PASS by delta proof D3 (a): no eligibility/freshness/policy code in the IDR-129 diff; execution-ready 53 after STRICT = baseline 53; R4 48-53", "G7-G10": "INHERITED; rehearsal offset/cursor continuity; R1 URP 0, under-min-ISR 0, core 3 members", "G11": "INHERITED as v2.2.4: PASS under post-hoc A5, FAIL without; not re-run", @@ -222,7 +179,7 @@ "G13": "INHERITED 76/76 (writer 2deb90b0 unchanged); window BOOTSTRAP -> STRICT READY 64/64", "G14": "INHERITED; no R4 CPU sample recorded (predeclared not a gate)" }, - "endpoint_report_sha256": "fbb26280abf8daf493a3cda0c920bb3868562a034d8813ea976960588831baef", + "endpoint_report_sha256": "aece31e4814a4aa52caced2ffef55e1d892cfa73ae0bc9ecbae360cc776b8cb4", "sdk": { "name": "qdl-sdk", "version": "2.4.1", @@ -239,7 +196,7 @@ "note": "runs on the PR heads after the push; recorded in the PRs (the file is part of the head)" }, "limits": [ - "POST-HOC P1: G5 PASS only with G5-maintenance (hot-read latency while a Query memory-maintenance run executes) NOT_MEASURED; each run blocks the replica loop 136-160 ms, at most once per 120 s, only above 448 MiB RSS; 0 runs in production after the window. Owner confirmation required.", + "G5 D3 (b) rests on an isolated A/B (one 1-vCPU replica, private read-only cache copy, 10 reads/s, beside other agents' test containers without the host lock by owner instruction 2026-10-20 ~04:30Z, judged on paired deltas): not a production latency figure. A maintenance run blocks its replica's loop ~130-150 ms, at most once per 120 s, only at >= 448 MiB RSS (0 runs in production after the window).", "Supported load (IDR-128 OPEN, owner 2026-10-19): the inherited latency envelope was measured with unrelated heavy stacks paused; a mixed portal workload on the same host is outside the certified scope. The window and R4 ran with the portal running (passive load).", "Inherited: G11 PASS only under post-hoc A5; G14 DL CPU 5.75 vCPU above the 5 vCPU budget (not a gate); IDR-108 open; G12 harness shape is not production shape; G13 shadow-certified; writer vendors SDK 2.4.0.", "Not measured passively: served event age, delivery lag venue->canonical, end-to-end venue->TS cache (inherited from v2.2.4).", @@ -258,9 +215,9 @@ "writer": "unchanged image; identity mount follows the generation (render.json rollback commands in the window dir)" }, "evidence_sha256": { - "upgrade/evidence/releases/v2.2.5/CERTIFICATE.md": "466421b02fa63299e2c4616c55e55fc7e76396c0d2875a7f898adcc2b33ea975", - "upgrade/evidence/releases/v2.2.5/RELEASE_NOTES.md": "6b409c41b7c007fa36a0776f4251b7a4069b4887418c7732a604c34803f118bf", - "upgrade/evidence/releases/v2.2.5/CERTIFICATE_SCOPE.md": "9f5c3fc747624c3dd2f9ae41b09d81b5a1fdff42644fd42282be15a176cfa596", + "upgrade/evidence/releases/v2.2.5/CERTIFICATE.md": "f190e2de86087c21810a0f4d7f71813df549f0cf567b3b6dc549acc4a2d7a483", + "upgrade/evidence/releases/v2.2.5/RELEASE_NOTES.md": "bb3a7c700aa5ece1a6b93eb2910bebf61305ab3d1fa7986a8ec0bafd15f45615", + "upgrade/evidence/releases/v2.2.5/CERTIFICATE_SCOPE.md": "0bbdec1ecdb267b1a0f3c8518bac26f5a776c31f774e90d068a2491fe864cd5b", "upgrade/evidence/releases/v2.2.5/MAINTENANCE_WINDOW_PACKET.md": "eadb4fe727aabeb9912570dd044770191f9f0c7bf061d21a8ac312bf1ad288bf", "upgrade/evidence/releases/v2.2.5/W12_DECISION.md": "ca416086b3b4dfe1f650359d417c2dabce55b222f17b13cff7b2cd7de531e614", "upgrade/evidence/releases/v2.2.5/W12_DECISION_EVIDENCE.json": "05f95dbac13507ddff0c6828e40c532a0183de91e957cf8db9e60c1f3a0d8fdc", @@ -292,7 +249,51 @@ "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-verify.json": "0a650aa55b50db5bee5f25ec424300433b2c29a4d5585f3bf287e68ea7e04449", "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-verify.out": "d271178827e273c9702735c97a4e8c961cffb8c1305878525a2b98f5b583dd1b", "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12a-ready.json": "452c464de3727e0fc3c4ca5fac194ae6781be9c39ba3e7781277f20f27c3cdd4", - "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12b-ready.json": "3879b063cb2aaffcac13eb519cb9ec8e7f2f1062af85e21492acc8990461c2dd" + "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12b-ready.json": "3879b063cb2aaffcac13eb519cb9ec8e7f2f1062af85e21492acc8990461c2dd", + "upgrade/evidence/releases/v2.2.5/query-ab-20261020/SHA256SUMS": "e8052f803714089ccea2f98ef32b1aee89f8fa03240b54871b89ab60cad01c40", + "upgrade/evidence/releases/v2.2.5/query-ab-20261020/byte-compare.json": "41ebcc3c575e3fb1cb37ee069cd5eff156bb0ed7ef0dd4b0b5becc51e22ae7e4", + "upgrade/evidence/releases/v2.2.5/query-ab-20261020/compare-rerun.json": "188e5a1ef6efb181d80da873437bbe723c4c11dde9ebfc808996c8902d1031c9", + "upgrade/evidence/releases/v2.2.5/query-ab-20261020/foreign.jsonl": "ca9aaf2ce46204739820d6fd73ac7d67599e9b0debd6218242d334be4db10ab3", + "upgrade/evidence/releases/v2.2.5/query-ab-20261020/prereg.json": "0f2f00b43f1a1e28fedd055d90ca9f01dcd2376eb5e9d2053936b5cec081d924", + "upgrade/evidence/releases/v2.2.5/query-ab-20261020/receipt.json": "d3899b2232c8cf874924d5d825a47e3e24fb9c8ee95ec70b62e9df3e73609d74", + "scripts/v225_query_hot_read_ab.py": "1d6aa8e6003ea7e0f73dcab136d03843cf7bda65c2577fbcaecdc0b081ef6836" }, - "evidence_sha256_note": "the .md entries are the files as committed with this certificate; certificate.json cannot list its own sha256" + "evidence_sha256_note": "the .md entries are the files as committed with this certificate; certificate.json cannot list its own sha256", + "superseded_proposals": [ + { + "id": "P1", + "label": "POST_HOC_PACKAGING_DECISION (proposed, never used)", + "proposed": "2026-10-20 ~03:00Z in the first issue of this certificate (PR #48 head e3a17cd8)", + "superseded_by": "owner decision 2026-10-20 '\u0110o lu\u00f4n r\u1ed3i tag': the D3 (b) item was measured (query-ab-20261020)" + } + ], + "gates_without_a5": { + "G1": "INHERITED_PASS", + "G2": "INHERITED_PASS", + "G3": "INHERITED_PASS", + "G4": "INHERITED_PASS", + "G5": "PASS", + "G6": "PASS", + "G7": "INHERITED_PASS", + "G8": "INHERITED_PASS", + "G9": "INHERITED_PASS", + "G10": "INHERITED_PASS", + "G11": "FAIL", + "G12": "INHERITED_PASS", + "G13": "INHERITED_PASS", + "G14": "INHERITED_PASS" + }, + "query_ab": { + "path": "upgrade/evidence/releases/v2.2.5/query-ab-20261020/", + "verdict": "PASS", + "receipt_sha256": "d3899b2232c8cf874924d5d825a47e3e24fb9c8ee95ec70b62e9df3e73609d74", + "prereg_sha256": "0f2f00b43f1a1e28fedd055d90ca9f01dcd2376eb5e9d2053936b5cec081d924", + "byte_compare_sha256": "41ebcc3c575e3fb1cb37ee069cd5eff156bb0ed7ef0dd4b0b5becc51e22ae7e4", + "prereg_commit": "0bba638525ee0f3353196add403a39db3fc8a59b", + "session_tool_commits": [ + "543ddf1810713b198713549f669bd93e4ea996df (arms + first BC)", + "b5b36e7272de06bc5e230d22eef7c96e64bf0374 (BC re-run)" + ], + "session": "~/.local/state/qdl-v2/releases/v2.2.5/query-ab-20261020c (attempts 1 query-ab-20261020 and 2 query-ab-20261020b measured nothing: harness mount defects, stopped)" + } } diff --git a/upgrade/evidence/releases/v2.2.5/endpoint-report.json b/upgrade/evidence/releases/v2.2.5/endpoint-report.json index 3c79a7fc..8f6c9d0c 100644 --- a/upgrade/evidence/releases/v2.2.5/endpoint-report.json +++ b/upgrade/evidence/releases/v2.2.5/endpoint-report.json @@ -51,7 +51,7 @@ 8306 ] }, - "concurrent_hot_read_latency": "NOT_MEASURED (the harness drives warmups only)", + "concurrent_hot_read_latency": "measured 2026-10-20 in the pre-registered A/B below (query_ab_20261020)", "harness": "scripts/idr129_query_rss_isolated.py", "image_equivalence": "84512ab and the released 9b6747f carry identical qdl/api_v2/router.py, qdl/query/service.py, qdl/runtime/memory_maintenance.py, qdl/runtime/stable.py (git diff empty); 9b6747f adds the IDR-127 config", "shape": "one Query replica, 1 vCPU / 2 GiB, private copy of the 64 burst products (production volume), 64 concurrent SDK-shaped warmups per burst x 12, no manual gc/trim during bursts" @@ -65,6 +65,146 @@ "query_kn_2": 233.6 } }, + "query_ab_20261020": { + "byte_compare": { + "requirements": 65, + "status_counts": { + "200": 128, + "503": 2 + }, + "triples": 130, + "verdict": "PASS", + "volatile_paths": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ] + }, + "byte_compare_sha256": "41ebcc3c575e3fb1cb37ee069cd5eff156bb0ed7ef0dd4b0b5becc51e22ae7e4", + "concurrency": { + "foreign_test_like_containers_seen": [ + "contracts-test-node", + "control-api-test-node-2756921", + "control-api-test-node-epg08-final-20261020-0510", + "control-api-test-postgres-2756921", + "control-api-test-postgres-epg08-final-20261020-0510", + "live_data_executor", + "redis_marketdata", + "redis_service", + "trading-system-manager-read-live-portal_manager_issuer-1", + "trading-system-manager-read-live-portal_manager_read-1", + "trading-system-manager-read-sandbox-portal_manager_issuer-1", + "trading-system-manager-read-sandbox-portal_manager_read-1", + "ts35-impact-unit" + ], + "load1_min_max": [ + 8.22, + 13.26 + ], + "locks_seen": [ + "null" + ], + "mode": "CONCURRENT_WITH_FOREIGN_LOCK", + "psi_cpu_some_avg10_min_max": [ + 1.34, + 7.74 + ], + "samples": 93 + }, + "maintenance_runs_new_image": [ + { + "arm": "B1", + "gc_ms": 121.054, + "overlapping_latency_ms": [ + 7.9, + 44.7 + ], + "overlapping_reads": 2, + "rss_after_mib": 370.3, + "rss_before_mib": 460.8, + "run_ms": 130.709, + "trim_ms": 9.655 + }, + { + "arm": "B2", + "gc_ms": 131.179, + "overlapping_latency_ms": [], + "overlapping_reads": 0, + "rss_after_mib": 381.2, + "rss_before_mib": 490.5, + "run_ms": 147.166, + "trim_ms": 15.987 + } + ], + "note": "A/B numbers of one 1-vCPU replica under back-to-back bursts; not a production latency claim", + "paired_deltas": { + "bound_p95_ms": 17.9555, + "bound_p99_ms": 41.861250000000005, + "mean_d_p95_ms": -41.9015, + "mean_d_p99_ms": -19.462500000000006 + }, + "path": "upgrade/evidence/releases/v2.2.5/query-ab-20261020/", + "prereg_sha256": "0f2f00b43f1a1e28fedd055d90ca9f01dcd2376eb5e9d2053936b5cec081d924", + "receipt_sha256": "d3899b2232c8cf874924d5d825a47e3e24fb9c8ee95ec70b62e9df3e73609d74", + "rules": { + "BC": true, + "HR1": true, + "HR2": true, + "HR3": true, + "HR4": true, + "HR5": true + }, + "scored_hot_reads": { + "A1": { + "max_ms": 787.944, + "n": 3972, + "p50_ms": 17.344, + "p95_ms": 186.017, + "p99_ms": 437.8, + "statuses": { + "200": 3773, + "503": 199 + } + }, + "A2": { + "max_ms": 837.189, + "n": 3609, + "p50_ms": 17.287, + "p95_ms": 173.093, + "p99_ms": 399.425, + "statuses": { + "200": 3421, + "503": 188 + } + }, + "B1": { + "max_ms": 738.39, + "n": 3750, + "p50_ms": 16.752, + "p95_ms": 122.887, + "p99_ms": 391.721, + "statuses": { + "200": 3558, + "503": 192 + } + }, + "B2": { + "max_ms": 761.381, + "n": 3830, + "p50_ms": 16.893, + "p95_ms": 152.42, + "p99_ms": 406.579, + "statuses": { + "200": 3646, + "503": 184 + } + } + }, + "shape": "one Query replica per arm, 1 vCPU / 2 GiB, private read-only cache copy, arms A1 B1 A2 B2 (A=3e9e4d3a, B=753604f8), 6 x 64-warmup bursts each, open-loop TS EXECUTION QUOTE/TRADE snapshots at 10/s", + "verdict": "PASS" + }, "rehearsal_burst": { "receipt": "upgrade/evidence/releases/v2.2.5/rehearsal-final-20261019T175600Z.json", "result": "3 x 64 warmups on image 753604f8, baseline 133.4 MiB, peaks 160-172, settled 156.8, no restart/OOM: PASS (near-zero row volume)", @@ -86,7 +226,7 @@ }, "limits": [ "Stage-100 latency/capacity numbers are inherited from v2.2.4, measured with unrelated heavy stacks paused (IDR-128 OPEN); mixed portal workload is outside the certified scope. The window ran with the portal running.", - "G5: hot-read latency concurrent with a Query memory-maintenance run (RSS >= 448 MiB) is NOT_MEASURED (CERTIFICATE.md section 4).", + "G5 D3 (b) rests on an isolated A/B (one 1-vCPU replica, private cache copy, run beside other agents' test containers without the host lock by owner instruction, judged on paired deltas); not a production latency figure.", "Served event age, delivery lag and end-to-end latency were not measured passively in the window.", "Single host; no HA.", "W14 monitor deferred: no DATA_LAYER watchdog runs.", diff --git a/upgrade/evidence/releases/v2.2.5/query-ab-20261020/SHA256SUMS b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/SHA256SUMS new file mode 100644 index 00000000..4f9cc28d --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/SHA256SUMS @@ -0,0 +1,20 @@ +0f2f00b43f1a1e28fedd055d90ca9f01dcd2376eb5e9d2053936b5cec081d924 prereg.json +188e5a1ef6efb181d80da873437bbe723c4c11dde9ebfc808996c8902d1031c9 compare-rerun.json +d3899b2232c8cf874924d5d825a47e3e24fb9c8ee95ec70b62e9df3e73609d74 receipt.json +41ebcc3c575e3fb1cb37ee069cd5eff156bb0ed7ef0dd4b0b5becc51e22ae7e4 byte-compare.json +ca9aaf2ce46204739820d6fd73ac7d67599e9b0debd6218242d334be4db10ab3 foreign.jsonl +d613f3f90dd5fb9c54bf094e8f6c6c8b0fce405b019150f355121a1412aeed3c cmp-out/byte-compare-raw.json +ca8dbab77007e4b7aac7fe761d7bb8aa99d0aa6dcc4c4f8c654f3d2581f8b7bb arm-A1/hot.jsonl +ca6f7ba9b599e5abaf2e063015df1d477c0a02d42cd2d85cb1ce28acaf393afb arm-A2/hot.jsonl +00d4756ecf87736ea483de8232a573a724ae1608467fa40dccec39d918f41c51 arm-B1/hot.jsonl +16ac89bd9431cc8847e90ba01d9b355478de8f67d145a3cd00ddb5f70e3cebc5 arm-B2/hot.jsonl +99dae80d8ecef6f623f97b62dad86f454953359f3c7d6aeb56f5e40efe3fdd4f arm-A1/events.jsonl +ab8b67d9dae56aa018822ffcdcd4c64c10cb745e064b5ffa94fc60b514b04643 arm-A2/events.jsonl +af83b1243b887d56f23d0157584a4725d8f79881368483f1c3980385a756c028 arm-B1/events.jsonl +103ebcae7157b340a946c2b5aaa4c8b0b6b0cdbfc9a3aff549a939c67d9a67d7 arm-B2/events.jsonl +9b3d0a44f8f44a51dfc7a24a8cb059fe071f7d446901702b442c3a93c4c2539c arm-A1/qdl-hr-q-A1.log +c9a05abafcd994e270df2293c48c257b77ecf4c1e63925f60111102e46f77e3f arm-A2/qdl-hr-q-A2.log +e363fda60874fa1209cbe901f238dbb937d92e055c726e2a9ad31ad8c1d9697f arm-B1/qdl-hr-q-B1.log +7c71707e03ff702811c77f5907843cce27fbd09ab918bbe0b73e68758a1949ea arm-B2/qdl-hr-q-B2.log +5f0cbcd643f081d00a56f48569220f0a5feaaa629822b1bb78eb24b3c9bb9430 cmp-rerun/driver.out +7887ae16f42d17e1fb0c5fd177917910e253b8c94b493b3e4be40398db23becd cmp/driver.out diff --git a/upgrade/evidence/releases/v2.2.5/query-ab-20261020/byte-compare.json b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/byte-compare.json new file mode 100644 index 00000000..1419d2a3 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/byte-compare.json @@ -0,0 +1,4525 @@ +{ + "schema": "qdl.v225.query-warmup-byte-compare.v1", + "old_image": "sha256:3e9e4d3add0f35c5d4b4796c785a35b466c326d3328184f396182b5f51367fff", + "new_image": "sha256:753604f8abaa866e2de30c7ccaf36168986bc6991550ee326d53e51b83d1550a", + "manifest": "trading-system.paper.stable r11", + "prereg_rule": "for every TS r11 requirement, in each of 2 passes, a valid triple (A, B, A' = second request to A, issued together with the sync paused) exists within 3 attempts; valid = A and A' differ only in scalar leaves (V); PASS when for every valid triple: status A == B, content-type A == B, Content-Length header == body length on A and B, no Transfer-Encoding, the JSON leaf paths where A and B differ are a subset of V, and the bodies are byte-equal after replacing the raw values at V by one placeholder", + "prereg_sha256": "0f2f00b43f1a1e28fedd055d90ca9f01dcd2376eb5e9d2053936b5cec081d924", + "requirements": 65, + "triples": 130, + "status_counts_A": { + "200": 128, + "503": 2 + }, + "volatile_paths_seen": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "problems": [], + "verdict": "PASS", + "per_requirement": { + "00:TRADE:a953e16e-7138-5562-b5e8-c337a44d0b65": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3592, + 3592 + ], + "content_length": [ + "3592", + "3592" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "37f1b717f0d4a4b94b674adc14eede69fa6de1f944f9ec7449519496c6693336", + "B": "77568ef9eacf143d4405143cc089975b018abc509e2f1ab9518b89be4823fd00" + }, + "normalized_sha256": { + "A": "4578dd5a8d1cc7b0d2544e53b7fb69e4ea5c7c5dc0aa9b3d531c38037af308e2", + "B": "4578dd5a8d1cc7b0d2544e53b7fb69e4ea5c7c5dc0aa9b3d531c38037af308e2" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3593, + 3593 + ], + "content_length": [ + "3593", + "3593" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "ea10ccac45facae0c15bd2b1c45fcbccfbcea728c965093a660728632b1df10b", + "B": "2a8c91163c04dc0b76c64e7a009d4a6fde1899281c995e82c6a0db477176fc99" + }, + "normalized_sha256": { + "A": "9e353cce7069bdc5f88335e636ee3731463c2552777cd9b5a036e8582fc38b33", + "B": "9e353cce7069bdc5f88335e636ee3731463c2552777cd9b5a036e8582fc38b33" + } + } + ], + "01:TRADE:ee93fabf-68df-5b50-8924-51bf25a5a757": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3591, + 3591 + ], + "content_length": [ + "3591", + "3591" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "ed9fddbb70489140a8393c13bff9c0e447edb156dc97ab7d9051dd8c46dee568", + "B": "582b9c87decb6d69b6da886c18e69482ea5d82d386662f7a7287b4f4c2d64ae8" + }, + "normalized_sha256": { + "A": "a9680b786f7ae57434b96bbc08093150b83c4f0ba4c302a9b4397a2a2cdc6c19", + "B": "a9680b786f7ae57434b96bbc08093150b83c4f0ba4c302a9b4397a2a2cdc6c19" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3590, + 3590 + ], + "content_length": [ + "3590", + "3590" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "6975263669b1b7b8db396f1afacd0eadf068050b1321c9258d1e20c127b625a1", + "B": "55b860f90bf8ab592d2e150d41a7594c5ffe58b46a165b4c323474dc466e185a" + }, + "normalized_sha256": { + "A": "c514a582ffc73dad790bf5c02f9fccbc59a23d31525a1f76d65e50374beac721", + "B": "c514a582ffc73dad790bf5c02f9fccbc59a23d31525a1f76d65e50374beac721" + } + } + ], + "02:QUOTE:a953e16e-7138-5562-b5e8-c337a44d0b65": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3652, + 3652 + ], + "content_length": [ + "3652", + "3652" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "cbe1059278895db50c6529d8060bf1909600877e8e812267e9cad83666798f5a", + "B": "2cf7220f76fb75de673f9e507084db23af231b09a43ef5c52249556b562809ee" + }, + "normalized_sha256": { + "A": "35ca842fc4365285705061c8ebca8acf005f9ae84a9f2877bbb3ebf0aea4cfee", + "B": "35ca842fc4365285705061c8ebca8acf005f9ae84a9f2877bbb3ebf0aea4cfee" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3651, + 3651 + ], + "content_length": [ + "3651", + "3651" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "5568a14f74d7db43445e55d9cafc702724f2235c1f42bb7269ee568f21ab0365", + "B": "b1802d460a9093c43f3b717e7d1c05857ddfe72a6f4839c34a5ebd7bb5172f3e" + }, + "normalized_sha256": { + "A": "5b163a56e28dcc4f1ae2f92650364eb995498cb0d037dfafd099466114378de7", + "B": "5b163a56e28dcc4f1ae2f92650364eb995498cb0d037dfafd099466114378de7" + } + } + ], + "03:QUOTE:ee93fabf-68df-5b50-8924-51bf25a5a757": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3652, + 3652 + ], + "content_length": [ + "3652", + "3652" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "8afee34515db3f7ec8d810b8403532bbdbf3b5fa2e9c4149af5449a49037d37c", + "B": "4976279bd3e540346d9dd7b9a453964f36853df247fdb791bbdd6f949a28c424" + }, + "normalized_sha256": { + "A": "07655a931463e493e960483690c584551e00faf52750aa061597899c5ede36de", + "B": "07655a931463e493e960483690c584551e00faf52750aa061597899c5ede36de" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3652, + 3652 + ], + "content_length": [ + "3652", + "3652" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "44026b3a55fb1674bf6941f0541865bcbbcdc0de3f413d1e2748dce02d1f8f8a", + "B": "6a75ca74bc68faf335f30d8bf63f2e41298364342758c4f21432b9a04aaade12" + }, + "normalized_sha256": { + "A": "89f2176d725a28d40567565fd8cfff2893f2236eed95d50fcf07687bcfa2f1af", + "B": "89f2176d725a28d40567565fd8cfff2893f2236eed95d50fcf07687bcfa2f1af" + } + } + ], + "04:BAR:a953e16e-7138-5562-b5e8-c337a44d0b65": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2898241, + 2898241 + ], + "content_length": [ + "2898241", + "2898241" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "da1b991bee4419bb7dc72ac41527921cbb3a3e2a7c1deef2c1e469e8e130c899", + "B": "481fd8af87018deab301dfd05edff7751c86270e42d40e71bdb9687c239feee1" + }, + "normalized_sha256": { + "A": "69cb85b670ed6b0f467df2dc730389f36e5b3abe3d3d50d14cc8f9cfbec29ba2", + "B": "69cb85b670ed6b0f467df2dc730389f36e5b3abe3d3d50d14cc8f9cfbec29ba2" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2898236, + 2898236 + ], + "content_length": [ + "2898236", + "2898236" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "f6fd92c2619a2e9105de2b3739b59cea387819c0d622d639d98a0bd8e596efec", + "B": "ec2c816909b2ea8a7e1298ac679af53d13f7729075c38fdffb0a095f8c5b96b3" + }, + "normalized_sha256": { + "A": "d6b5c87eb14358d7e583136e30e3717d5d3d9645ab1c9bfa4710b856bf3f30c8", + "B": "d6b5c87eb14358d7e583136e30e3717d5d3d9645ab1c9bfa4710b856bf3f30c8" + } + } + ], + "05:BAR:ee93fabf-68df-5b50-8924-51bf25a5a757": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2899070, + 2899070 + ], + "content_length": [ + "2899070", + "2899070" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "5deeb59f7487c04d72c052be367a2815d1bd165c7f21565733ef793d5a424170", + "B": "ca747f54f6db22b3d9da91e1ee4e4649393dcae07f1379f96a6d51d0223d589e" + }, + "normalized_sha256": { + "A": "e231df1dd2bb8b290230e0b63a27ed5344b0d7c2223153705026e659be39175c", + "B": "e231df1dd2bb8b290230e0b63a27ed5344b0d7c2223153705026e659be39175c" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2899073, + 2899073 + ], + "content_length": [ + "2899073", + "2899073" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "a485951e005c292eab3e308edb50c3b9f6c9e69dea403e5f27c22582b3d92306", + "B": "9da6d9d2dd089df929f20368056896289dceb30c250385aa627b5ce6738aa489" + }, + "normalized_sha256": { + "A": "00d56d26c92f70bf9020c326ee3b67df78e190d4f0d6bc391b1a78752d6cb42c", + "B": "00d56d26c92f70bf9020c326ee3b67df78e190d4f0d6bc391b1a78752d6cb42c" + } + } + ], + "06:TRADE:fb26214c-7b9b-5961-95b2-55154755af0f": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3551, + 3551 + ], + "content_length": [ + "3551", + "3551" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "58c125b2fcb0ea934f3cde344acd1d52582b2ede38d3f85e6073bf2d42f0c0c5", + "B": "6cfc8eeeefe38b11ab20911916822e897b96f8149b32d518cc38662ebb7eb007" + }, + "normalized_sha256": { + "A": "189fd4b3ef2f725b27f83c49d1e16a9f4c21cf892960014386717d829cc96934", + "B": "189fd4b3ef2f725b27f83c49d1e16a9f4c21cf892960014386717d829cc96934" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3556, + 3556 + ], + "content_length": [ + "3556", + "3556" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "a12952de8f5e291f80f82a6dfe1a304032f65ab94e22c2d2f1046117f85ea6be", + "B": "c9c622c0d83fabfb65270203ee97fd98c51cd738841fdbc931e8c7498c682de4" + }, + "normalized_sha256": { + "A": "1947cc855b2c74dd2d38cafb710b8989d83081c3c1b42bbe3736d4f62525e444", + "B": "1947cc855b2c74dd2d38cafb710b8989d83081c3c1b42bbe3736d4f62525e444" + } + } + ], + "07:TRADE:e49b54ae-c23d-5351-9e64-47934aac28f8": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3558, + 3558 + ], + "content_length": [ + "3558", + "3558" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "3b85322be7c49784b8ef114f4df24796a32d52fae0027391efbc3a855ba8634e", + "B": "932eda3cf0dd84152ca1e6192d893eab45fe50e09f1ae7b617845dc2c7cdfa86" + }, + "normalized_sha256": { + "A": "8866c2e3f8dd099b41b9a1e17d62e20838b7a600dd474f3390bb80b7c0638243", + "B": "8866c2e3f8dd099b41b9a1e17d62e20838b7a600dd474f3390bb80b7c0638243" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3560, + 3560 + ], + "content_length": [ + "3560", + "3560" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "96e3f5785a3581ddcbc4eeacefb0fc4aa59af2ce45bf1eb02374dc953cd9b4e7", + "B": "4eb8dcf42c2cf321787bb7c12c0a1d37c0cee97ab8faaa7affde16bf99ef016f" + }, + "normalized_sha256": { + "A": "38055eb21a0e6836c03b1b93fff57208301dec47eaa3922d5cfee8e82c8fa784", + "B": "38055eb21a0e6836c03b1b93fff57208301dec47eaa3922d5cfee8e82c8fa784" + } + } + ], + "08:QUOTE:fb26214c-7b9b-5961-95b2-55154755af0f": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3613, + 3613 + ], + "content_length": [ + "3613", + "3613" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "b3544dc181fb23ebb9eaedd858d8c3e9d0d71ce44f58be607eb946943f669271", + "B": "2dfccd6cb752bf7ff6880a8e9c25f9718cb9a33a780573c32fa6897213ffe8c7" + }, + "normalized_sha256": { + "A": "4b97c6d8b0c2b401fc2b700f344e313a8d086c153c2ecc55726afbdb9440ed1c", + "B": "4b97c6d8b0c2b401fc2b700f344e313a8d086c153c2ecc55726afbdb9440ed1c" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3614, + 3614 + ], + "content_length": [ + "3614", + "3614" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "41e07365182615aa76a88f4f92ff58d066b246c64f6570eb7345a3c5a69839c0", + "B": "d05cc3451c6264c9ee55d617970a56955d3c488e2db65f9c7a1dc84570900eb7" + }, + "normalized_sha256": { + "A": "bc9a2a65370127a1455e2f169e68a3ff16718bc79e480a5237013a2de298ee44", + "B": "bc9a2a65370127a1455e2f169e68a3ff16718bc79e480a5237013a2de298ee44" + } + } + ], + "09:QUOTE:e49b54ae-c23d-5351-9e64-47934aac28f8": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3624, + 3624 + ], + "content_length": [ + "3624", + "3624" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "a5e8877fcfbd798b713288c989af9b3ec4f5a6c326969f40030931a6b76324d7", + "B": "a0cf368bd9e4606c852c96e66b629e7cdbcfe86ab70c561f88ed2f63c4f24875" + }, + "normalized_sha256": { + "A": "e10b3adc4291640e277c5d279846fe018969817fae30ee9d348baa267ff611b8", + "B": "e10b3adc4291640e277c5d279846fe018969817fae30ee9d348baa267ff611b8" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3622, + 3622 + ], + "content_length": [ + "3622", + "3622" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "7125a968c0fc7676a11647f0756cc050406085345cf278eab469777dd170b8e5", + "B": "674cce239514c393974a31177e9335bce871398fe1cb44677b9df70edf8136f7" + }, + "normalized_sha256": { + "A": "639dfb6bf57ac812ed0bd3bcc20c6949f7cdc19001c90964684d0d5ed4cdbc6d", + "B": "639dfb6bf57ac812ed0bd3bcc20c6949f7cdc19001c90964684d0d5ed4cdbc6d" + } + } + ], + "10:BAR:fb26214c-7b9b-5961-95b2-55154755af0f": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2936714, + 2936714 + ], + "content_length": [ + "2936714", + "2936714" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "255c2c069c4c951cc4453d667dd8cbc41e173d1b5e624606468ebaafa8e11a18", + "B": "602c6acf34044a0a31c8d4816f23692cd6306e2ccaa14c3d49b1fdc391f3c6d9" + }, + "normalized_sha256": { + "A": "f33ed598ba17a96dfd648376fdd5d658c9010c2c99982677515608ff28f0856a", + "B": "f33ed598ba17a96dfd648376fdd5d658c9010c2c99982677515608ff28f0856a" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2936706, + 2936706 + ], + "content_length": [ + "2936706", + "2936706" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "8391886bd4713d8127dd0de2ea2ffa7cff86903858c324321d9a66388a7238d7", + "B": "d72bc985ab2f6b1bae8380dce94d9bf5734a8ceff406327aa5a4a9daa381c48b" + }, + "normalized_sha256": { + "A": "f634bf3e1e71207f7a8e77e6e3b63c26c96299563f9e0405dc14313a7ddcdc56", + "B": "f634bf3e1e71207f7a8e77e6e3b63c26c96299563f9e0405dc14313a7ddcdc56" + } + } + ], + "11:BAR:e49b54ae-c23d-5351-9e64-47934aac28f8": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2949100, + 2949100 + ], + "content_length": [ + "2949100", + "2949100" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "efccb7d9b052d3f645468421ae94765c7260806849fbfeaf59ec1053fd1c1163", + "B": "1f935b5bba25e2d9936ed921e4912f5342127f39000d816b096abf7a28416a76" + }, + "normalized_sha256": { + "A": "d9d5eea8c03b6c1d12413117c8ff4077d82e260a36230e9d4c9957c79f59f0ec", + "B": "d9d5eea8c03b6c1d12413117c8ff4077d82e260a36230e9d4c9957c79f59f0ec" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2949094, + 2949094 + ], + "content_length": [ + "2949094", + "2949094" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "6999056db6dc7aa66d41b7daad03c97540d3c6cc2a18a1d052d554f7d06157a1", + "B": "8332ba62c6dd0c006bc51d090bf7672592401a1ad634fc0d1fb5e59d551bc8b3" + }, + "normalized_sha256": { + "A": "69b737806ff23a80503887022a69865e58415bdd058e88974e2f448c2ecde4b6", + "B": "69b737806ff23a80503887022a69865e58415bdd058e88974e2f448c2ecde4b6" + } + } + ], + "12:TRADE:e4ce7249-a4e8-5073-beb8-dab908596c34": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3592, + 3592 + ], + "content_length": [ + "3592", + "3592" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "1805713a4e57e0307b57d4f09cddcd9e1feb0e1f54d8b55ec5421dae024a981e", + "B": "c6978c5934179ee7416bf99d9591310bcfa65433929410bb80519dbb3d0ff56f" + }, + "normalized_sha256": { + "A": "d3fda1fcb599116f59e20deed6f1f7751832cf005217e649734ce254e68493dc", + "B": "d3fda1fcb599116f59e20deed6f1f7751832cf005217e649734ce254e68493dc" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3593, + 3593 + ], + "content_length": [ + "3593", + "3593" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "df0683a88e766307dd9b95a8617e3006f3bb1f65a2ec1f606bb02e02c5777321", + "B": "a7eeeaa0c2336e3f400120786caba2506c88aa599d3f30e5dafb1ae9ce2e4812" + }, + "normalized_sha256": { + "A": "11f7ac3b295c64896317cbe45e72ec137dda0ad2e69a8945791817b6a3a1b66a", + "B": "11f7ac3b295c64896317cbe45e72ec137dda0ad2e69a8945791817b6a3a1b66a" + } + } + ], + "13:QUOTE:e4ce7249-a4e8-5073-beb8-dab908596c34": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3659, + 3659 + ], + "content_length": [ + "3659", + "3659" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "b8a71647e381445a11e274cf5752954f840a83f01b1f27af6afd7d31fa4a5f16", + "B": "fe30537f4cf17923d57ff6b9406dbd72cfd0937a8cbebf503fafa7007749f27c" + }, + "normalized_sha256": { + "A": "49d03dd9534b4eb7fed022b2eb71ba6a5ebc00a9649cccb2cc169e2ae9540d00", + "B": "49d03dd9534b4eb7fed022b2eb71ba6a5ebc00a9649cccb2cc169e2ae9540d00" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3659, + 3659 + ], + "content_length": [ + "3659", + "3659" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "933e0567ec2a3a900d460d2ccd482076b3e85d39850177f6d47d8fa5a5e51bd4", + "B": "31ab31a1d984b21507952a054249050b45de00915650bf320e7784f1e3e00b14" + }, + "normalized_sha256": { + "A": "acdf295d3216cdc0904c377cb53ced1a58a14ead28b84198c8159f3c0bf67581", + "B": "acdf295d3216cdc0904c377cb53ced1a58a14ead28b84198c8159f3c0bf67581" + } + } + ], + "14:BAR:e4ce7249-a4e8-5073-beb8-dab908596c34": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2905731, + 2905731 + ], + "content_length": [ + "2905731", + "2905731" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "e79f1dacb49a9e30f615355c9b227280c9d5b09eb90716dd3057c475a22b103e", + "B": "782090327dd99eea49bc7aa4b679b1375b705605bf2b427c8528adeec291c065" + }, + "normalized_sha256": { + "A": "317d6b2ab0d1051076ac9ae727b577f5e3641fa0ebc37393c6b55d38c3dd8519", + "B": "317d6b2ab0d1051076ac9ae727b577f5e3641fa0ebc37393c6b55d38c3dd8519" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2905757, + 2905757 + ], + "content_length": [ + "2905757", + "2905757" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "3b8816ed5a4dcd564b755e3dd5a8e205e3b607c173971378a15bd4654f4f999a", + "B": "bd6cf843e70403dd5a1a45c2ca0451daff6e1d4d40dcc82dfd61b54af6a33025" + }, + "normalized_sha256": { + "A": "1d496dabd669f041d183584bbf8db506435af6ee770719c6fd727b943e63d166", + "B": "1d496dabd669f041d183584bbf8db506435af6ee770719c6fd727b943e63d166" + } + } + ], + "15:TRADE:8aedd349-6999-5874-b0dd-34c6451c0b3a": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3590, + 3590 + ], + "content_length": [ + "3590", + "3590" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "f25723f3bbec46a217bf2baf130d95924f1737ad8e01295169acb25d3b3b8796", + "B": "40c8f0e4a0512c7fcd984029bb150e699ff772484f4ca675fdcf3f9487e29726" + }, + "normalized_sha256": { + "A": "ff0f00527a93e0c56c200c26a033b634f90f9205abd9c265d6a7215ec19d063a", + "B": "ff0f00527a93e0c56c200c26a033b634f90f9205abd9c265d6a7215ec19d063a" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3592, + 3592 + ], + "content_length": [ + "3592", + "3592" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "2b0233234493c68e47efb4365d4430a9b2fbd40eee7e4f2bbee86ad8b8261f35", + "B": "451afef417b0ff3db52f1f10f53fafd56d16e80f13821ccd2215e4969bab9d30" + }, + "normalized_sha256": { + "A": "ca301888ecc230129d3b3541ac49c7c7a130a50f5c985ddbd2ae17bb1bbfb2a4", + "B": "ca301888ecc230129d3b3541ac49c7c7a130a50f5c985ddbd2ae17bb1bbfb2a4" + } + } + ], + "16:QUOTE:8aedd349-6999-5874-b0dd-34c6451c0b3a": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3652, + 3652 + ], + "content_length": [ + "3652", + "3652" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "aaddcacc8578c8185c4eaf6eb8ca76dc5c541254c691782dca4c6049a0492a80", + "B": "87cef380e4719954584d4ab98bb851fd02d213c6a898a8c5a8c2f618bbfa671c" + }, + "normalized_sha256": { + "A": "0aa0e216f0d689c011472f2d3b57b7cca448c8618fc2fa60b5970e995261c70f", + "B": "0aa0e216f0d689c011472f2d3b57b7cca448c8618fc2fa60b5970e995261c70f" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3653, + 3653 + ], + "content_length": [ + "3653", + "3653" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "2704ac307c1cc2b0f3a5e8cda66fafa2fca41d07b3d2e1b3c8f66cefa6192626", + "B": "3a6bb0b1e6b96d4313b6bd421a008721c0415623abe278944c4d548c911d9421" + }, + "normalized_sha256": { + "A": "8b92e9b3686f2bdce4b6559faad735074a1b8ac82a2bac837a7e9b675f6a63b2", + "B": "8b92e9b3686f2bdce4b6559faad735074a1b8ac82a2bac837a7e9b675f6a63b2" + } + } + ], + "17:BAR:8aedd349-6999-5874-b0dd-34c6451c0b3a": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2897055, + 2897055 + ], + "content_length": [ + "2897055", + "2897055" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "f16d97c14adb2774638cf63f60a6e56f832aa815fd61a602a4c67d684e74ad41", + "B": "a7fe1c04041cd7fa466e0f6dfc1b5d228a48570212805d9f2944d9ed4cb213df" + }, + "normalized_sha256": { + "A": "d441bf7055f28d0acab0dccf42e6678481f6e24ac2d3e02d7e5af6b19c425373", + "B": "d441bf7055f28d0acab0dccf42e6678481f6e24ac2d3e02d7e5af6b19c425373" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2897070, + 2897070 + ], + "content_length": [ + "2897070", + "2897070" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "3217322e4b9cde16c344d4afc020e8efe4dc343a1d09ea5205df4b4ad7d94910", + "B": "91661eff61a79fcaeec5a0dddafbb4bc1e1003e7b5210176e184f4ee37d34bb2" + }, + "normalized_sha256": { + "A": "81545af911ef4ea3bb83a2cf2d5a3f63fc79e968796455e548a86b0ae4be92b0", + "B": "81545af911ef4ea3bb83a2cf2d5a3f63fc79e968796455e548a86b0ae4be92b0" + } + } + ], + "18:TRADE:b2d78145-b541-58e2-941b-06c44c65e45f": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3589, + 3589 + ], + "content_length": [ + "3589", + "3589" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "04a3a7a3c0668955d1ebc8e6da425f3d2c88e62c9f118243f9527a695c8408e2", + "B": "b8cd42b22d5b854adf30bbd71647540b007dbe54a9d068278c5c085611b6db0d" + }, + "normalized_sha256": { + "A": "bf479fa81a9e11d7fa534681e6b2cdf1f15d55ced46feb5ff19d1a33ce19adb7", + "B": "bf479fa81a9e11d7fa534681e6b2cdf1f15d55ced46feb5ff19d1a33ce19adb7" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3610, + 3610 + ], + "content_length": [ + "3610", + "3610" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "e0eff21b43b1ed098c4e77bdccf0673aef3a2b4573ca0f46b526518bac576505", + "B": "32530721edec734e9465134de4a9712c90a53b62e9e7f8accd74c5a0e5d2b3ec" + }, + "normalized_sha256": { + "A": "82de43be8868d838b1fcd58250b45cc4b9f1c9868a852993769aa16a50762501", + "B": "82de43be8868d838b1fcd58250b45cc4b9f1c9868a852993769aa16a50762501" + } + } + ], + "19:QUOTE:b2d78145-b541-58e2-941b-06c44c65e45f": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3644, + 3644 + ], + "content_length": [ + "3644", + "3644" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "33d068771f597da3377ef58745bcb1c0b6a32eb25b3e75736d6cdb6a749115b2", + "B": "5d9d7456196aea3aff62adb9e9261b437ae4f0183b701b4c562e0d5c4b3c1881" + }, + "normalized_sha256": { + "A": "b025320a321960ddb9b6bcf77813d6841e5020adda9a77dceebc7bd518b02733", + "B": "b025320a321960ddb9b6bcf77813d6841e5020adda9a77dceebc7bd518b02733" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3647, + 3646 + ], + "content_length": [ + "3647", + "3646" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "d68f251f3e77cc6eac409df14b91c363136ab50868c61b5d1bf5e5be0055160f", + "B": "c4f3eb8b1e970c6c063a76d93c520d67a9904813ca001eee371c16b08bee3724" + }, + "normalized_sha256": { + "A": "2b30b0fcd0691c6cc1b97f7f766b64e238a1de2e343ba8fecfabbed710bfe1a9", + "B": "2b30b0fcd0691c6cc1b97f7f766b64e238a1de2e343ba8fecfabbed710bfe1a9" + } + } + ], + "20:BAR:b2d78145-b541-58e2-941b-06c44c65e45f": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2887216, + 2887216 + ], + "content_length": [ + "2887216", + "2887216" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "95d158ecdf2102f3228b1fc77258a07ccd912accaca78c9d32c7d825b0aafc3e", + "B": "2b2dc66207e54f8d13de5e10a355960fada735183229c05361c468dd8c7925b6" + }, + "normalized_sha256": { + "A": "ee401bb10f0e117b62055355b24122d9a4dad2bcc4857d2bc29b13c5df62f2eb", + "B": "ee401bb10f0e117b62055355b24122d9a4dad2bcc4857d2bc29b13c5df62f2eb" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2887200, + 2887200 + ], + "content_length": [ + "2887200", + "2887200" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "f71e7c2fa8146be6a522e57ab52aa5ea9a8430e0c1aa2c7f7b815a8d5add85a1", + "B": "16cfe5adaf46a8dba166d755bf211b2230fa5bdc2205bc1644bccddfd653c4ad" + }, + "normalized_sha256": { + "A": "5908271e83077356b0237d54055c4fa0a27a990a3eda280c835a6052b66a0665", + "B": "5908271e83077356b0237d54055c4fa0a27a990a3eda280c835a6052b66a0665" + } + } + ], + "21:TRADE:a6884fb3-1fa0-53e0-9621-d01ba5f9a2de": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3557, + 3557 + ], + "content_length": [ + "3557", + "3557" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "c075026c6f2faba2590166cd27ed7b53bf00c1b8515dc0250763e2929aade200", + "B": "40ea1e33f78f1163bb9707090be52f55eb9a2cb9f749ee113e854fd924827ee6" + }, + "normalized_sha256": { + "A": "eb0b8250b4844a41dff7168f385342f0638883432447c9e77bbe60897e0707ad", + "B": "eb0b8250b4844a41dff7168f385342f0638883432447c9e77bbe60897e0707ad" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3559, + 3559 + ], + "content_length": [ + "3559", + "3559" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "5e23e3f55c56fad366f1b8937c21c0a6d9d126eb11760c9902fe265793b21fec", + "B": "6af2413612d1639a513acc84fb2049f69f179b4ff9f4c1b458e57a25079f2d18" + }, + "normalized_sha256": { + "A": "27714ea2e6bd012d65d8bd5b7051135d02f8d2c24a14d884b311a5c24947fe62", + "B": "27714ea2e6bd012d65d8bd5b7051135d02f8d2c24a14d884b311a5c24947fe62" + } + } + ], + "22:QUOTE:a6884fb3-1fa0-53e0-9621-d01ba5f9a2de": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3618, + 3618 + ], + "content_length": [ + "3618", + "3618" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "de566c348b54629b8bd39bac4306ccc36157256f1f5d940c729d29cdfa213185", + "B": "e145f20b83026b3c544aaa4d51f5481cbad52be5aa847be76530bd16ff5d9354" + }, + "normalized_sha256": { + "A": "fa18e5c8359eea2da221aaf00d4305d75db0a50480de7224e9791bb4dba77c3d", + "B": "fa18e5c8359eea2da221aaf00d4305d75db0a50480de7224e9791bb4dba77c3d" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3618, + 3618 + ], + "content_length": [ + "3618", + "3618" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "24fa1ecf3120c0f353a4f0274be5ea51a3fc342fcac4ead4449910ca7aee3342", + "B": "67e15d7b141876a33a20c151060057da4a8f9af6b8c2e5d8419b3d46213b6f1d" + }, + "normalized_sha256": { + "A": "2ae006940366b92fe7d241a798ef49f3f644c859855227f4829d3987854e4b69", + "B": "2ae006940366b92fe7d241a798ef49f3f644c859855227f4829d3987854e4b69" + } + } + ], + "23:BAR:a6884fb3-1fa0-53e0-9621-d01ba5f9a2de": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2936163, + 2936163 + ], + "content_length": [ + "2936163", + "2936163" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "bfb6f869b0fb667e4a695ac84eb82f50af238def22b8054adfbb37e583bff998", + "B": "7ac512c66c453a46a592acea509006594fa75640afc1a6e847afd98fa49f93be" + }, + "normalized_sha256": { + "A": "39cd80ca60ed51ccffc1c4ca3a20357603e2278b271ccd690f78c9f5de25ffea", + "B": "39cd80ca60ed51ccffc1c4ca3a20357603e2278b271ccd690f78c9f5de25ffea" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2936155, + 2936155 + ], + "content_length": [ + "2936155", + "2936155" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "fadbba7ef09fe9a59ef93746540ad16c26a2c9c5d644858b6404b84ed55a452c", + "B": "31a2144b974734db3e6e3243f6003c1789eb396e6559c2144387a65aead103c8" + }, + "normalized_sha256": { + "A": "4cebb72d661375f6b1397567c56a1abf1c603c1b3fd2f7f2cc64393712ea6332", + "B": "4cebb72d661375f6b1397567c56a1abf1c603c1b3fd2f7f2cc64393712ea6332" + } + } + ], + "24:TRADE:6c7c9256-2905-5c75-a149-fa0ac36bbbc7": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3582, + 3582 + ], + "content_length": [ + "3582", + "3582" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "e823ae1fb3e47286b1f71e85ca3e9a2cf6517e19a178cf748ca953891224943d", + "B": "0c7aeb2a4146ed79d6c722358eb64c2ed59a51ac3519280677df612679718f36" + }, + "normalized_sha256": { + "A": "bee6aa2c51a59c59726c187548e7fb824f329ad75b9d016d46f4b10cc1701ea6", + "B": "bee6aa2c51a59c59726c187548e7fb824f329ad75b9d016d46f4b10cc1701ea6" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3562, + 3562 + ], + "content_length": [ + "3562", + "3562" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "7e2b73de7ad2cee4f47e0201f2196dd80815c57245f3a0905ee4690d4225141c", + "B": "a2bc636bcad379e0d8e06d4ffb447e31aea953ccd8458cbc42de69aa48c681c4" + }, + "normalized_sha256": { + "A": "3b9c189689e43227cebb1e0161fe2096380965101fb4695a6290924cc8d69f59", + "B": "3b9c189689e43227cebb1e0161fe2096380965101fb4695a6290924cc8d69f59" + } + } + ], + "25:QUOTE:6c7c9256-2905-5c75-a149-fa0ac36bbbc7": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3619, + 3619 + ], + "content_length": [ + "3619", + "3619" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "5c1713bf3415aa894385812405ddbe25d7edfc5304f930eba9dd964d565ed48e", + "B": "7278adc2b189a2e6070bbd205e9d6a1e32750378e042401d3161032b47c8b744" + }, + "normalized_sha256": { + "A": "220853b96df3a3d304ca3bafe3dd7d48f86fa8a10964402f7d6bfe250508f296", + "B": "220853b96df3a3d304ca3bafe3dd7d48f86fa8a10964402f7d6bfe250508f296" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3617, + 3617 + ], + "content_length": [ + "3617", + "3617" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "eb880f336edc5def6926e2dde2baf1cba1886271f8aa4aefeaf7bf449e0f0676", + "B": "c7438dc30d32712267086c52a1f1fdeb1582f26863a50bca28d5bcacd4256508" + }, + "normalized_sha256": { + "A": "3175c8fe3b47b51ac95e886a6ce802b000af0e42a3ba823a44f2ad3c84dd7c1a", + "B": "3175c8fe3b47b51ac95e886a6ce802b000af0e42a3ba823a44f2ad3c84dd7c1a" + } + } + ], + "26:BAR:6c7c9256-2905-5c75-a149-fa0ac36bbbc7": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2937279, + 2937279 + ], + "content_length": [ + "2937279", + "2937279" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "1aea7d24e9dd81fed0d957d20f1229f333f908a3aa82f1a9968f7f72d57328f2", + "B": "31a5fdbc33bd1b60858e0b72e9d6349bc5860c9dbc64d0a12cf01061f1d82094" + }, + "normalized_sha256": { + "A": "f35c2059487ab69f748d9f27a65e4e79bfaf3145114fafe7e2ef3c0e35330534", + "B": "f35c2059487ab69f748d9f27a65e4e79bfaf3145114fafe7e2ef3c0e35330534" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2937281, + 2937281 + ], + "content_length": [ + "2937281", + "2937281" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "b14730a00e299275a0af8b41bd1ec100de3463f77f970331c27cdcc7ad46e005", + "B": "a60023c36566d794e2b5667879ce22d725bab1bc40b439c816595132f3e84a55" + }, + "normalized_sha256": { + "A": "42d34ebf56ae3e6f0ee7ff567f53b5e6e7b8f5042c34a02cecb0ec9cfc583ec4", + "B": "42d34ebf56ae3e6f0ee7ff567f53b5e6e7b8f5042c34a02cecb0ec9cfc583ec4" + } + } + ], + "27:TRADE:f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3568, + 3568 + ], + "content_length": [ + "3568", + "3568" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "ea0a38465f0c7d5829e6e6a87f379538492463e239d5d76b2b39e21af65ba487", + "B": "f33fdda4887ff9ffc26661866f8fe32fb1397a6b622cc50de6f88cd23920edef" + }, + "normalized_sha256": { + "A": "c4cdbfc13637d612470690b7890489bdccec4ef2893cd97cc2ef6a2f181494ab", + "B": "c4cdbfc13637d612470690b7890489bdccec4ef2893cd97cc2ef6a2f181494ab" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3572, + 3572 + ], + "content_length": [ + "3572", + "3572" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "453f69c792c2a882fad384aa27a1a7eb802e9ae3cb4b61466ec72ab82aad0e29", + "B": "4a58df0f1a622800f480770df0a2528124c7648a1fa6a19ca095470d3f1d4fb6" + }, + "normalized_sha256": { + "A": "21daa3f284890a375977c915d397b8b9d11daa58f76b10c02dbc7440068e80ef", + "B": "21daa3f284890a375977c915d397b8b9d11daa58f76b10c02dbc7440068e80ef" + } + } + ], + "28:QUOTE:f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3602, + 3602 + ], + "content_length": [ + "3602", + "3602" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "fba74c4b13a0223c671ebafae64cc2ed54cc177210b84d6e5565dcdfbcc56e93", + "B": "d9b3ed4c599bdde71f3b9898406c3fd8aa09a90817851fe7cae63b3ef0471ad2" + }, + "normalized_sha256": { + "A": "ed7401b4d568532636535998d7c6cfdea0478f0195077cf6076905ddf6c9d839", + "B": "ed7401b4d568532636535998d7c6cfdea0478f0195077cf6076905ddf6c9d839" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3607, + 3607 + ], + "content_length": [ + "3607", + "3607" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "8b689b9c0dca857b43bed03bd8930552a75bed6c4f1ccf319733444b8afd612d", + "B": "1a837530cb8a0441294d80dca54ef36d3870bc671a79fe352b0e918e33241575" + }, + "normalized_sha256": { + "A": "f01fd6b74b9accef5f38f41966cb905e0ce43252422c6bf2606face12a7725f8", + "B": "f01fd6b74b9accef5f38f41966cb905e0ce43252422c6bf2606face12a7725f8" + } + } + ], + "29:BAR:f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2909953, + 2909953 + ], + "content_length": [ + "2909953", + "2909953" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "7c87668a639ed6b5f3825506fbdd509a2e03f19c6a252f2a19a5d2d741212066", + "B": "a9b27f763c7a453982dfbcb1d7d5d98f43acbc69b94c74fae79368fe842438ab" + }, + "normalized_sha256": { + "A": "1ef3026406f23eedd77f7b0553e1e8cc7f935fd8f62dd40e1ee5a1e04fb73f88", + "B": "1ef3026406f23eedd77f7b0553e1e8cc7f935fd8f62dd40e1ee5a1e04fb73f88" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2909953, + 2909953 + ], + "content_length": [ + "2909953", + "2909953" + ], + "rows": 1000, + "volatile_path_count": 2002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "27133512ad63d11369338db15d8426de920c894cedd9706ee3c09615f9b98de4", + "B": "e8fc27ce08ff9dbb7d7bd88ed7f87885118a15fffc3cacbbd7b93a5d432252ca" + }, + "normalized_sha256": { + "A": "f55e307810ddac2fef1e8707dd1fa7dae3d028c50f3c550660baef71924e236e", + "B": "f55e307810ddac2fef1e8707dd1fa7dae3d028c50f3c550660baef71924e236e" + } + } + ], + "30:MARK_INDEX_PRICE:a953e16e-7138-5562-b5e8-c337a44d0b65": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3578, + 3578 + ], + "content_length": [ + "3578", + "3578" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "0ce10fd030f205b7d975507f91bb353b0ad1663f255bb62f13fb62e3605a4469", + "B": "962b0516b57203e19478f58e8f6721855c0df391ceb1e6cff90a7ea197124a90" + }, + "normalized_sha256": { + "A": "d1911c600fa26ff536df3a9a40d8d6131f3932dfa7bf491e24717ede5a54ed7a", + "B": "d1911c600fa26ff536df3a9a40d8d6131f3932dfa7bf491e24717ede5a54ed7a" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3578, + 3578 + ], + "content_length": [ + "3578", + "3578" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "9a59fd0be7cdb6f5e4da0565de447072e8d1953de3151084394438b171266c9a", + "B": "5cc4698f107ad0848fe723e47b90a62891c8cd7e7add33c9acf0ea85079d8683" + }, + "normalized_sha256": { + "A": "91f85cfab587439d37e3771c0cb6bf28ce5a38bca57d284f293eec44d2271ad0", + "B": "91f85cfab587439d37e3771c0cb6bf28ce5a38bca57d284f293eec44d2271ad0" + } + } + ], + "31:BOOK_SNAPSHOT:a953e16e-7138-5562-b5e8-c337a44d0b65": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 41552, + 41552 + ], + "content_length": [ + "41552", + "41552" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "d37ca50b2b7e8c67b59cbf2a1f440dcdc8976cdcd5cc7f6245bda50b0d417dc2", + "B": "21cb2a21be024a0ebb0b72f149fcbc94f1e54304acb9081a36bd8dceb16b28aa" + }, + "normalized_sha256": { + "A": "cf876a9eb2ed08703f19ce3dc5d898249093e8653f5a3a40bc0cd253692e3fbb", + "B": "cf876a9eb2ed08703f19ce3dc5d898249093e8653f5a3a40bc0cd253692e3fbb" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 41583, + 41583 + ], + "content_length": [ + "41583", + "41583" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "7c4c2e685b8b6f13d7cde9344de3eb2601b22cd2cf4457d8c6062aa1ad30a2b1", + "B": "68bc4c518d9d20f8059ad9f9cbd723008c8c3094b3fd4bd7bdf7cb3cb9c64ffd" + }, + "normalized_sha256": { + "A": "6c6c03c0ac7c95bfa5284b7d4debf7bb7984658b8faed6d396062330c7dd95d7", + "B": "6c6c03c0ac7c95bfa5284b7d4debf7bb7984658b8faed6d396062330c7dd95d7" + } + } + ], + "32:BOOK_DELTA:a953e16e-7138-5562-b5e8-c337a44d0b65": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 21349, + 21349 + ], + "content_length": [ + "21349", + "21349" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "a9de2900f641a1c097323e1303320f20ca237b32e32ea15594731af4b340ab45", + "B": "747edf7c6ae9a8d22e3b1d0c0220664c6a077a77cf076576fbc4ac0e9869bd4a" + }, + "normalized_sha256": { + "A": "889ce16eca9c4203ace1802d7bdbb459ff6b8403a91f29a42b24b2b63311dbb6", + "B": "889ce16eca9c4203ace1802d7bdbb459ff6b8403a91f29a42b24b2b63311dbb6" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 9731, + 9731 + ], + "content_length": [ + "9731", + "9731" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "0457cf4f6d8bfda1a8e4f9bbf326ada7778b17e90d6b6de0c98c972359391642", + "B": "3e73b056c1991d52ad7e69894e6eac5b1ce3d2c30d97d1539c0bbf14e7c2d72d" + }, + "normalized_sha256": { + "A": "ddffb6db11bc0ab4d89063ae4263429aa0565ccef2ca29da7afb81b48bb885f7", + "B": "ddffb6db11bc0ab4d89063ae4263429aa0565ccef2ca29da7afb81b48bb885f7" + } + } + ], + "33:MARK_INDEX_PRICE:ee93fabf-68df-5b50-8924-51bf25a5a757": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3573, + 3573 + ], + "content_length": [ + "3573", + "3573" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "ccccf322b763e580870025ba78b0b0a08f031bfee0c4838d676fd9ac05e3da04", + "B": "b8be02fbdaeb43d41521cc2efce53d113698e9a65987e3ad29acd7d706de36b4" + }, + "normalized_sha256": { + "A": "ac9040c99a8faf7a649a728f47acbcd949552a5cea216db601c251b376cf999f", + "B": "ac9040c99a8faf7a649a728f47acbcd949552a5cea216db601c251b376cf999f" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3574, + 3574 + ], + "content_length": [ + "3574", + "3574" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "f583fe29d191fab7809b9d4ecdfb40d693c134b64ed91195a800b7ce90906a5b", + "B": "a5652b946f25e1f9598562407a431f5779c3588019cf0b4537c1b88bc2700116" + }, + "normalized_sha256": { + "A": "e5acc64a0718ed1479828ca6a19e697eae6224abc1402c7ddb64e9f5923f0cb1", + "B": "e5acc64a0718ed1479828ca6a19e697eae6224abc1402c7ddb64e9f5923f0cb1" + } + } + ], + "34:BOOK_SNAPSHOT:ee93fabf-68df-5b50-8924-51bf25a5a757": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 42101, + 42101 + ], + "content_length": [ + "42101", + "42101" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "ff570b319cb44f70c8f1612a4a2f330594837aa16078e1b1bc509835607acbef", + "B": "946f5370e91b82a98b37a74f167a598d08e2c164ed0ba4e1e2f892b9006d2177" + }, + "normalized_sha256": { + "A": "31f16e1f4adc537c146f5b444bc5eea1174dd2569e27e865cfbb49b9bbee1610", + "B": "31f16e1f4adc537c146f5b444bc5eea1174dd2569e27e865cfbb49b9bbee1610" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 42094, + 42094 + ], + "content_length": [ + "42094", + "42094" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "d8623d46cfa5c168671bd5c01cec899a282342a952a2780dbce3a658e1474239", + "B": "14e1ea5ab99ac70586c4f1bfb7a6e6483c76ca7d15a49a5ed9d927835c891800" + }, + "normalized_sha256": { + "A": "85a8d33d3e3bab2a45998dd4b5f067371d829a40a27615346b4ab70b465e1cac", + "B": "85a8d33d3e3bab2a45998dd4b5f067371d829a40a27615346b4ab70b465e1cac" + } + } + ], + "35:BOOK_DELTA:ee93fabf-68df-5b50-8924-51bf25a5a757": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 11830, + 11830 + ], + "content_length": [ + "11830", + "11830" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "d8747526b7cf8b2373fdaf275edb1e03c3c803a8469add21156d2cae3604f192", + "B": "b7c26e0115cac72659f6634dc397f7f7af7fafcb0442fddf98c95ae0af9ee877" + }, + "normalized_sha256": { + "A": "6f36bf8b60e2486ee6ed63796c42c318b3c71f6905d8e5e4bddefa61d2fbc48f", + "B": "6f36bf8b60e2486ee6ed63796c42c318b3c71f6905d8e5e4bddefa61d2fbc48f" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 12030, + 12030 + ], + "content_length": [ + "12030", + "12030" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "6f714208d1b4e0a253888bc60e231368cd9096c6d9477a9dd2fe771fca1270d1", + "B": "0b8ed30a54a0b3f1ffdf326341dfdfdffd2367279c3945d59ccc735361a793ec" + }, + "normalized_sha256": { + "A": "e13bceea17b68170341ab56cb9831897f9aee3aeb028e45d202def394687f585", + "B": "e13bceea17b68170341ab56cb9831897f9aee3aeb028e45d202def394687f585" + } + } + ], + "36:MARK_INDEX_PRICE:fb26214c-7b9b-5961-95b2-55154755af0f": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3524, + 3524 + ], + "content_length": [ + "3524", + "3524" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "e6b3134d60c22ffe31997c8b92f3d9ffd47c0849202c80e6cdb175067ce49473", + "B": "c8198c49e87acabdcd9eab426c24e2ea5ece1de70cc703931c4b28a282aeb87b" + }, + "normalized_sha256": { + "A": "4ae24ab518967be345a1e8609db7053c8150a35ee5bf22bad150931481384caf", + "B": "4ae24ab518967be345a1e8609db7053c8150a35ee5bf22bad150931481384caf" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3524, + 3524 + ], + "content_length": [ + "3524", + "3524" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "4789a0155b3643e64ca20eb75fde60c629a4dee63eed238ac6c23e190b1861eb", + "B": "af894b926d70755660708a85435453f979827d235c6e454e6a59d585bade832d" + }, + "normalized_sha256": { + "A": "94534e6221233af59b73c9a9f515c6f7d223939b0942222a30a910b6c6379d81", + "B": "94534e6221233af59b73c9a9f515c6f7d223939b0942222a30a910b6c6379d81" + } + } + ], + "37:BOOK_SNAPSHOT:fb26214c-7b9b-5961-95b2-55154755af0f": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 41158, + 41158 + ], + "content_length": [ + "41158", + "41158" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "cb952cd4ed937cb9ebad22037541ac329556b97c22db49cd6bb3bf8edd265690", + "B": "47d5ffd973dd9493b4c637d7ec24163aff4e291cf4a793b3f2d67392880405c3" + }, + "normalized_sha256": { + "A": "0bdc7a68e7815fc444e51edceccd91c80b68d72da7604bfff3478b992ee9db02", + "B": "0bdc7a68e7815fc444e51edceccd91c80b68d72da7604bfff3478b992ee9db02" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 41125, + 41125 + ], + "content_length": [ + "41125", + "41125" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "18c7df460928fa5e723ff6305811e9adef5b98c3a977cb2f836b2a91ebe7a655", + "B": "58c209d94446a91d5d169c175eb7370cf318324625dfd439edd076f3c0c05301" + }, + "normalized_sha256": { + "A": "c028bd917c0c3216e7a45a6f21cc6427719064464256cbdf6cf5eb65d3a15bc8", + "B": "c028bd917c0c3216e7a45a6f21cc6427719064464256cbdf6cf5eb65d3a15bc8" + } + } + ], + "38:BOOK_DELTA:fb26214c-7b9b-5961-95b2-55154755af0f": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 5367, + 5367 + ], + "content_length": [ + "5367", + "5367" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "d78572b507a69aba82edb47a628bb7e87616e3e418a5c7bdf3e2beca75640966", + "B": "dcc5d55bd2b011bc1da6124dc5d0607fb120411ac80fb144667830adbe60d061" + }, + "normalized_sha256": { + "A": "4977b7cf801cf44b219b6d85f45b1a475433e84abd679a2883b9815e8549d81f", + "B": "4977b7cf801cf44b219b6d85f45b1a475433e84abd679a2883b9815e8549d81f" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 8776, + 8776 + ], + "content_length": [ + "8776", + "8776" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "4abef2f1f230b01ccf592257ab1f34c9f9365366d0f37ba22bef9e3dc7181b94", + "B": "1ff774189d5f6866ca7470a36afac9c215f517bdf46b7dbbe3f4c6a5ee187a48" + }, + "normalized_sha256": { + "A": "0b5d6fc544fb4dd97fcea8aca3a26729d0c2faafbbb693094a367a328c708d7e", + "B": "0b5d6fc544fb4dd97fcea8aca3a26729d0c2faafbbb693094a367a328c708d7e" + } + } + ], + "39:MARK_INDEX_PRICE:e49b54ae-c23d-5351-9e64-47934aac28f8": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3524, + 3524 + ], + "content_length": [ + "3524", + "3524" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "9d34103d7b61e34744cd61a24e0af15fecf88acfc6849bf93f5526cc80ab3e57", + "B": "df9b2790ff69fa2d106d369922289315eb29d1135df37c77b09993773b745992" + }, + "normalized_sha256": { + "A": "383c5a73aa8b0f9afd75b1148ac8650ec7078255a3ae3852067a40d40372ac1e", + "B": "383c5a73aa8b0f9afd75b1148ac8650ec7078255a3ae3852067a40d40372ac1e" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3524, + 3524 + ], + "content_length": [ + "3524", + "3524" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "aa2447ee76d80b003a5b686ffa8a49fa47482d85b65c1496e45a60a78e6010fa", + "B": "2f85d78642663f763f8d4d032f6a44865478bd39750dcca32f0be689c9d9c1b2" + }, + "normalized_sha256": { + "A": "f51049d90e0335aa223332ca7a1c7cf4e4f3a6bdb6be1ebe7e390a8349820c1d", + "B": "f51049d90e0335aa223332ca7a1c7cf4e4f3a6bdb6be1ebe7e390a8349820c1d" + } + } + ], + "40:BOOK_SNAPSHOT:e49b54ae-c23d-5351-9e64-47934aac28f8": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 41583, + 41583 + ], + "content_length": [ + "41583", + "41583" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "65a38a9f7bc8cc671b460c0076eb94988c669702b0640be416cd453d96d67dac", + "B": "073ebd2d11f2a88b18ab220703099638f13fa21a839c0d1c65b260e08be6fb5a" + }, + "normalized_sha256": { + "A": "785a4d0fa8f777fe47a263c1b1cca252585400a169ea053c1bc38e24145eebc7", + "B": "785a4d0fa8f777fe47a263c1b1cca252585400a169ea053c1bc38e24145eebc7" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 41654, + 41654 + ], + "content_length": [ + "41654", + "41654" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "4aeb442544caa73163d9f4ae5253e747ee4f2c7dc9bc8dc3f523a268f24b0e58", + "B": "be2a9108cbe9b8bffceeaefaadedf07b604f3c79d4f929e5770f0a48c967d629" + }, + "normalized_sha256": { + "A": "8ca20293c1c3a4abfb51083d4bd31fde10e6549a672b3020a3e21c4320c1f8bf", + "B": "8ca20293c1c3a4abfb51083d4bd31fde10e6549a672b3020a3e21c4320c1f8bf" + } + } + ], + "41:BOOK_DELTA:e49b54ae-c23d-5351-9e64-47934aac28f8": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 4852, + 4852 + ], + "content_length": [ + "4852", + "4852" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "c60f9c6308e52bdc990ab8e0029e69e791ff3f186cdc694eccb40ca313119fd0", + "B": "2cb92a20d933ea9a37f3a70da400a987c1d41ce0f196b7cb552bd3dd686fbb3f" + }, + "normalized_sha256": { + "A": "87c5efe49ae0de85ed6dfc6113691167447a9e7f32fbe9a4d31880c9b900ad7b", + "B": "87c5efe49ae0de85ed6dfc6113691167447a9e7f32fbe9a4d31880c9b900ad7b" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15362, + 15362 + ], + "content_length": [ + "15362", + "15362" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "df7724d4d6e31376442e6764427a6e30869820351fc3b5868325e5482ccc80b6", + "B": "6c29088b4f25510f6d2ae2fc226ba6f49a3563e479c80b4ce2bfd7fe3d5dbf13" + }, + "normalized_sha256": { + "A": "d42a27d852648da1009f6a6a8d3905a46eaf552f7a1ac8c4a36b113efb370ffc", + "B": "d42a27d852648da1009f6a6a8d3905a46eaf552f7a1ac8c4a36b113efb370ffc" + } + } + ], + "42:MARK_INDEX_PRICE:e4ce7249-a4e8-5073-beb8-dab908596c34": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3571, + 3569 + ], + "content_length": [ + "3571", + "3569" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "2192d4d65abb3fe0b87ebf70dbebdcf9a6144e0ccbd3082a0dfdc615d90797e0", + "B": "4dcc2ad5ea1291c9c6fd17749c3285add1b6d96358cfd4d28a89245af06db181" + }, + "normalized_sha256": { + "A": "7de27d352389f53bd6ab27b23dec0a644bd68767ef344465298e540e039b078c", + "B": "7de27d352389f53bd6ab27b23dec0a644bd68767ef344465298e540e039b078c" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3571, + 3571 + ], + "content_length": [ + "3571", + "3571" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "0e784fe5303878d7a6e4a8f1b639b92c70120c04dc17244a1e2be827a2274564", + "B": "f4ec90d5a013a13f4a166379984b0acaef7acefbfd509b614c06508af01649c6" + }, + "normalized_sha256": { + "A": "c70ecbd8b86a07d6d041a4a8df9f9de24d42a8ef3f5b0e8633823c5659c1ca7d", + "B": "c70ecbd8b86a07d6d041a4a8df9f9de24d42a8ef3f5b0e8633823c5659c1ca7d" + } + } + ], + "43:BOOK_SNAPSHOT:e4ce7249-a4e8-5073-beb8-dab908596c34": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 42231, + 42231 + ], + "content_length": [ + "42231", + "42231" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "6d04607255285bb076e2d7de8e92a1f0e52cf7a875bb63a2cb66cad4cea910d5", + "B": "17c68f3815e76b26ef5c9869c278e0e50c29d4404c48ec4db298904bfd4741d9" + }, + "normalized_sha256": { + "A": "a9b7146041601549082c37bf77b20951eee2a3eed73742222cdb3a02a85e928a", + "B": "a9b7146041601549082c37bf77b20951eee2a3eed73742222cdb3a02a85e928a" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 42246, + 42246 + ], + "content_length": [ + "42246", + "42246" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "87f01a823683e3d51a6b1b4e1c7936dab4fccdf172b8e947b47d248bd7af8aaf", + "B": "23af2fc0ca5a66ba32c869cdb003d686b2606b0b92623559ec532fa809a8e614" + }, + "normalized_sha256": { + "A": "957800c7821c858be4f6858cb45689b35297b29a49367c1dc90cc615cfd14905", + "B": "957800c7821c858be4f6858cb45689b35297b29a49367c1dc90cc615cfd14905" + } + } + ], + "44:BOOK_DELTA:e4ce7249-a4e8-5073-beb8-dab908596c34": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 7679, + 7679 + ], + "content_length": [ + "7679", + "7679" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "7f006314b482044bbad89cfbeca7a374d6c2cee903c1e6a978760a8b34a2aa1d", + "B": "3f98d1f9ab2bddfa92cd93624d33e3c868aa2746f55984a5d8b62a2b120dad95" + }, + "normalized_sha256": { + "A": "6f1c95f498451f9aeca395bf9bb24e40031e0f2d06b8a84cb5130e5f43900be4", + "B": "6f1c95f498451f9aeca395bf9bb24e40031e0f2d06b8a84cb5130e5f43900be4" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 6097, + 6097 + ], + "content_length": [ + "6097", + "6097" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "09ee8e58e2417fc0fd6a87d0be0cae85e2f27671b05384c2797091a9579d2099", + "B": "ab7923dd33c8f8216c9cbdb4a6b22d5d15cfcbc6db9de2abcf497a0d49b935c6" + }, + "normalized_sha256": { + "A": "4a68c6ee5b82bed9b0dd5a353ca276e6deb47005f196838008da130f4587f088", + "B": "4a68c6ee5b82bed9b0dd5a353ca276e6deb47005f196838008da130f4587f088" + } + } + ], + "45:MARK_INDEX_PRICE:8aedd349-6999-5874-b0dd-34c6451c0b3a": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3560, + 3560 + ], + "content_length": [ + "3560", + "3560" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "55ddc20123cf4fb033e40da39e373150dca31bf147269d85656932086cc506fc", + "B": "bd19fab2259b7db32381b19ff50f9a0432e310b7f48334a9c7b2dfa05cc97c7a" + }, + "normalized_sha256": { + "A": "4117f25cbe479047333bd38ca290111bcf01bff566c30617f06b0b7138bd0d9b", + "B": "4117f25cbe479047333bd38ca290111bcf01bff566c30617f06b0b7138bd0d9b" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3560, + 3560 + ], + "content_length": [ + "3560", + "3560" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "843e880675509b79412c7012bf64f07f54d5bbd935d13c4ea459e7adfc59cdfc", + "B": "2315fe7a3f177fbe08eb149c4fd2faf831f2c3f5e46605e7c44af168c307803b" + }, + "normalized_sha256": { + "A": "3f2bf2e0833bcd6360f9911e37911a199443f8fc2ca6442dbb6b8ee3885ba42e", + "B": "3f2bf2e0833bcd6360f9911e37911a199443f8fc2ca6442dbb6b8ee3885ba42e" + } + } + ], + "46:BOOK_SNAPSHOT:8aedd349-6999-5874-b0dd-34c6451c0b3a": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 42355, + 42355 + ], + "content_length": [ + "42355", + "42355" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "3f30592d6380e067e3dacd02d295f41d7f2477e1b23714dab0d0784b60b8c629", + "B": "38e44b0268df39dd52997fca05214c794316a5c73a5455f88e15e1ecf5c76c7e" + }, + "normalized_sha256": { + "A": "989fce835826e3afffc4d80691b29a58cfdb6a6161adaf74f195403e1eab0ebe", + "B": "989fce835826e3afffc4d80691b29a58cfdb6a6161adaf74f195403e1eab0ebe" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 42341, + 42341 + ], + "content_length": [ + "42341", + "42341" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "56e2745c809123b1eecb7b7c952187d9b2819e041681313a64527575656b3f60", + "B": "e88b1a5623cca5c6d280de50ef9c1222ba5853f9f8fb306236d327d936fe2785" + }, + "normalized_sha256": { + "A": "b007ff11e732b90923893e475d74c3a781b5245cd218a593c26c09c26fe082e9", + "B": "b007ff11e732b90923893e475d74c3a781b5245cd218a593c26c09c26fe082e9" + } + } + ], + "47:BOOK_DELTA:8aedd349-6999-5874-b0dd-34c6451c0b3a": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 7071, + 7071 + ], + "content_length": [ + "7071", + "7071" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "ad6113ae579b031ec9963533787f01fe8062cce02d97acc32990c2b4fe303264", + "B": "fb17027fc70b3a87a4539723100a249ba9e8e93a987ffd29bf33476307fbd60c" + }, + "normalized_sha256": { + "A": "aeb46e4287fbaabb49621f8d2f2226aab7f9e80b2c8969d1e912557f41feea88", + "B": "aeb46e4287fbaabb49621f8d2f2226aab7f9e80b2c8969d1e912557f41feea88" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 4313, + 4313 + ], + "content_length": [ + "4313", + "4313" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "64387eff5d2c6d4681cf61258fba57e832574cf0c2de832215b8d3760dab0e1f", + "B": "b6457659ca3a6faa5d10ba23fda5c7877c9549a59e549a64a60c17133d0490fc" + }, + "normalized_sha256": { + "A": "9975667e2966904a44644d2988089ec4a9f56a8b946427975bce691e72646ec4", + "B": "9975667e2966904a44644d2988089ec4a9f56a8b946427975bce691e72646ec4" + } + } + ], + "48:MARK_INDEX_PRICE:b2d78145-b541-58e2-941b-06c44c65e45f": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3570, + 3570 + ], + "content_length": [ + "3570", + "3570" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "e1de7ffe4f2be1eb522a511e6de71bc551e2fa421a907fb4a72c3daeb9695d71", + "B": "68a84fa0423024e63976ade341eb1c97ae89c6ab0e67aa39950165ad6eb9a952" + }, + "normalized_sha256": { + "A": "e3e8a073d91dd7242fabbe093495ed26e7af4ba599fac0066fee2be8e4d0d98a", + "B": "e3e8a073d91dd7242fabbe093495ed26e7af4ba599fac0066fee2be8e4d0d98a" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3571, + 3571 + ], + "content_length": [ + "3571", + "3571" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "7d1db00bdbd09a61265a2d0eebf0d13983052c12129b7cbbdeb6508454ebbedd", + "B": "110c7a6da0bca6bfe6e46d1da43c659d7df014635bbb8005513a9cf61f3006fc" + }, + "normalized_sha256": { + "A": "dd131cbb4bb6e030c84db1364f1580741630386ca9e8374ec91bac9c8d59b716", + "B": "dd131cbb4bb6e030c84db1364f1580741630386ca9e8374ec91bac9c8d59b716" + } + } + ], + "49:BOOK_SNAPSHOT:b2d78145-b541-58e2-941b-06c44c65e45f": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 41371, + 41370 + ], + "content_length": [ + "41371", + "41370" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "f4709aeaa484bcac92e2e0de8790fb817ee2a0ea38ccca2caef0940bdaee5095", + "B": "f4a41fc1056e8abc40d0be773af5aada849ec1808e4c61ecd3e3df86d1420ad9" + }, + "normalized_sha256": { + "A": "eb3be1463139d39d36b409dac9b5a9084362a13e3713207ad8645d49b98355ee", + "B": "eb3be1463139d39d36b409dac9b5a9084362a13e3713207ad8645d49b98355ee" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 41364, + 41364 + ], + "content_length": [ + "41364", + "41364" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "cc15bdc7038dec1df75754ac46fee3d488c31e014bb0ecf54a8e85437c734127", + "B": "964ae91ffec096fb68c868ee2abd149f9b0e4f8de6c26e13dce40bd0781b7509" + }, + "normalized_sha256": { + "A": "cf627ac2916dc76460cd951c86052e8ccec3a268a338c47cb80ba39656342cee", + "B": "cf627ac2916dc76460cd951c86052e8ccec3a268a338c47cb80ba39656342cee" + } + } + ], + "50:BOOK_DELTA:b2d78145-b541-58e2-941b-06c44c65e45f": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 5833, + 5833 + ], + "content_length": [ + "5833", + "5833" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "f2336b03bf3cb8d4788bfebc5b3b24bc43943b9a07b11dfa1432382c0c7e2619", + "B": "987eb4b698ef22ce4677cda4d6e626bde252b9df17d6c70bd942e8e3f55e0b88" + }, + "normalized_sha256": { + "A": "c9df92c717f140695295572e008eee1c4931bba9f674249e7cbbc65b827cdde2", + "B": "c9df92c717f140695295572e008eee1c4931bba9f674249e7cbbc65b827cdde2" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 7568, + 7568 + ], + "content_length": [ + "7568", + "7568" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "0c987ae6e685fd0ad5cfaa9130ea4f26a0ba8f03e32bea8dd569c95b80c20208", + "B": "618828240eb2a746025a81b1ce35089a68655ff23ff5e9abed62e9fe4c46169f" + }, + "normalized_sha256": { + "A": "63c09e33bf64f199dfbbd7c1c0071ad317c4002d55d00b7a4b2878cfaff23464", + "B": "63c09e33bf64f199dfbbd7c1c0071ad317c4002d55d00b7a4b2878cfaff23464" + } + } + ], + "51:MARK_INDEX_PRICE:a6884fb3-1fa0-53e0-9621-d01ba5f9a2de": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3520, + 3520 + ], + "content_length": [ + "3520", + "3520" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "96943151d21d44b499c4a918ba48cee5ad33c899a494f62341bff3d884c7f773", + "B": "283ee44a16a27a4308012264588693cfc5530cac4c9a144a0467edc9367c2cb5" + }, + "normalized_sha256": { + "A": "ff7b3724a753ce8d7190ee74952a28dc33b53a839e3354ea8270478d7a9bfdc4", + "B": "ff7b3724a753ce8d7190ee74952a28dc33b53a839e3354ea8270478d7a9bfdc4" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3520, + 3520 + ], + "content_length": [ + "3520", + "3520" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "3dcf3c50eebb778da720b79041b22fb8c6fd6dd666f456a598b646be912fae04", + "B": "86406c6e6a8c9ba7bcc1fabfb226dd1f6f4be99c62717bce4b2c8bc566a03e27" + }, + "normalized_sha256": { + "A": "14cea6f00f277c95001002f9957615861f2876a7b32c396bcfd37569645d028e", + "B": "14cea6f00f277c95001002f9957615861f2876a7b32c396bcfd37569645d028e" + } + } + ], + "52:BOOK_SNAPSHOT:a6884fb3-1fa0-53e0-9621-d01ba5f9a2de": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 41898, + 41898 + ], + "content_length": [ + "41898", + "41898" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "20426964d25fdad35a5b69f7bff32afbe51a4ba4e29ef4c3d5fe298ef8a0889c", + "B": "cd49b931af6c5587edd07779eb844516a8ed5fb6e2c1f3ec4c4c75b85d65c0e4" + }, + "normalized_sha256": { + "A": "eb008187b379aa7cc2b5dfa2b84c108e698ef8c9170663362471b24ba49451a3", + "B": "eb008187b379aa7cc2b5dfa2b84c108e698ef8c9170663362471b24ba49451a3" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 41892, + 41892 + ], + "content_length": [ + "41892", + "41892" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "30de19beffa24d42be02390cdbe1a9bd70a65b79e130641719cbfa9e8e7a9288", + "B": "24eb5cc792a8fb52c56eb502fe3fed852e22ab34adcdfd97c02f455642b52c2d" + }, + "normalized_sha256": { + "A": "093dc70131490bf0879d44da723ac1a8927c0eafe155cdb851b05a5893230905", + "B": "093dc70131490bf0879d44da723ac1a8927c0eafe155cdb851b05a5893230905" + } + } + ], + "53:BOOK_DELTA:a6884fb3-1fa0-53e0-9621-d01ba5f9a2de": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 5040, + 5040 + ], + "content_length": [ + "5040", + "5040" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "455dba9f27aa95fed2ad02e4f5f92a7d33d0738db6b9a40bc597409cb20256f3", + "B": "958e45b9d4a565b2862b5da8badab452640222d103d7bb6bcce9288bcb332f2f" + }, + "normalized_sha256": { + "A": "648cfb0b0f51af718193a6b54df14c456a5cde75edca089128b2c9402869083a", + "B": "648cfb0b0f51af718193a6b54df14c456a5cde75edca089128b2c9402869083a" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 4460, + 4460 + ], + "content_length": [ + "4460", + "4460" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "75ee53a61fffcf51f41cedc96680250ab1c88120bfa09ea95c4f71932a62cfb6", + "B": "a583b87ed7814c57deaf7417d4f41687572dc3abded3546d1d259b4610d67ba2" + }, + "normalized_sha256": { + "A": "434f8c6419e2b75c7a58830cc2167688fae064b43c08f848ace08f5cb2bccfbc", + "B": "434f8c6419e2b75c7a58830cc2167688fae064b43c08f848ace08f5cb2bccfbc" + } + } + ], + "54:MARK_INDEX_PRICE:6c7c9256-2905-5c75-a149-fa0ac36bbbc7": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3519, + 3519 + ], + "content_length": [ + "3519", + "3519" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "e256700b1d96c479db121fea82c29e3f61f1bed2a1ba00a61ce985a448b481e6", + "B": "a3f210e738a8853d92267dc1932338396354a93ba93843ba8f1bd02aef3235d0" + }, + "normalized_sha256": { + "A": "58434ac22bf7df482535f2849f418b262467fd845a068003c6d7e92e2dee5aa5", + "B": "58434ac22bf7df482535f2849f418b262467fd845a068003c6d7e92e2dee5aa5" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3572, + 3572 + ], + "content_length": [ + "3572", + "3572" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "f7c9b5f75a240fa4b2a423f0bc89f23725fdcfcbdb82a6508eb592724c6c577c", + "B": "bc720122eb86261e87b62a49e8e7121db08d0d48650a7706743860d56c965408" + }, + "normalized_sha256": { + "A": "6c8c385b016af83d10c19fabe0c1af18d95adfbaa2e9b429dba8e669cd01aa44", + "B": "6c8c385b016af83d10c19fabe0c1af18d95adfbaa2e9b429dba8e669cd01aa44" + } + } + ], + "55:BOOK_SNAPSHOT:6c7c9256-2905-5c75-a149-fa0ac36bbbc7": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 41702, + 41702 + ], + "content_length": [ + "41702", + "41702" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "5b9a7d75bac1b98d9bd6f35bbde8dec861025193d360bb792f594df21e29c731", + "B": "38e2ce59fde27e104ef869512005774f2ca9224ed70b07ff3670f0999780f30e" + }, + "normalized_sha256": { + "A": "3f44c6568aeb64e5bbacecbbc4ae55d24be9c1d5de6a608740aae6395d4933f4", + "B": "3f44c6568aeb64e5bbacecbbc4ae55d24be9c1d5de6a608740aae6395d4933f4" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 41695, + 41695 + ], + "content_length": [ + "41695", + "41695" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "d7176d9c904c85f7cba2f7111fff38019bcafe5ee1bedf2e3294780b50d059ad", + "B": "ba71f2fbc83bdf1289a8042a9fb703b4d49c5aa5bbd121207c2cbcc344d14c02" + }, + "normalized_sha256": { + "A": "431524943e122bcb3170ca3ed0eab0c6be18ad51b1ebb8689bbbfceb13bbf400", + "B": "431524943e122bcb3170ca3ed0eab0c6be18ad51b1ebb8689bbbfceb13bbf400" + } + } + ], + "56:BOOK_DELTA:6c7c9256-2905-5c75-a149-fa0ac36bbbc7": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 6374, + 6374 + ], + "content_length": [ + "6374", + "6374" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "fbcba1378ed7201ab2e5ba2e545b390353ed84669bc92fac7a6703d4a40defdd", + "B": "1a91515ac57b90e0d54525fe5060a02c26dc01d48466f8a8182f6bee0eea79d8" + }, + "normalized_sha256": { + "A": "6a50e48c889aea2685b45711b50a27615177528b182e1fa46051b3aa79f350d7", + "B": "6a50e48c889aea2685b45711b50a27615177528b182e1fa46051b3aa79f350d7" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 4651, + 4651 + ], + "content_length": [ + "4651", + "4651" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "5d272483f41fdc09cc81c17beb2162ff7bba163fbbee86776352ad84fcc882cb", + "B": "02e59c8587e400071442ec17126ece173f68b6de675a078b5010bf88344d4797" + }, + "normalized_sha256": { + "A": "e055ead9d034f1b11f86789c0f504f7c0cd760741dc0c877d07a95aac7beee1f", + "B": "e055ead9d034f1b11f86789c0f504f7c0cd760741dc0c877d07a95aac7beee1f" + } + } + ], + "57:MARK_INDEX_PRICE:f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3514, + 3514 + ], + "content_length": [ + "3514", + "3514" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "0ff585077a784a351a21c031e89b4224fc2d711a1cd0a432dc8c9e70906059e4", + "B": "8043f4df0147b0fc50b89d1eda85d9f604839572440e74cb408273faede8cc45" + }, + "normalized_sha256": { + "A": "5c4992760228c74f14a085eb05aa9736bbac93a81b9452274cdccc377b410d22", + "B": "5c4992760228c74f14a085eb05aa9736bbac93a81b9452274cdccc377b410d22" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3515, + 3515 + ], + "content_length": [ + "3515", + "3515" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "911b8b9e4cc7fd289b4ed244250f2937e338409da30dc677a0962887875d368d", + "B": "82af6d87a8f3ca72d1be528a70c7da16fefd8db7dcc2177d14bb3f2f94f19d73" + }, + "normalized_sha256": { + "A": "7cd0bd0efebe72be28cb76d1afd99b22b5ebc851227dc29687f3452218233a2c", + "B": "7cd0bd0efebe72be28cb76d1afd99b22b5ebc851227dc29687f3452218233a2c" + } + } + ], + "58:BOOK_SNAPSHOT:f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 40528, + 40528 + ], + "content_length": [ + "40528", + "40528" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "460a59a6be560702d54a6d78196c4b3bca7976c39565c12c0f641e78f450fe72", + "B": "64e93bc666481df9d9892fd1b90a852c57984eacbcf8bb3c20d56667abc7078a" + }, + "normalized_sha256": { + "A": "88c76d04acee873b61784dbcce675415fbad192f151eabd34be33d98fd85e4e2", + "B": "88c76d04acee873b61784dbcce675415fbad192f151eabd34be33d98fd85e4e2" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 40535, + 40535 + ], + "content_length": [ + "40535", + "40535" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "6605a96c26904836cd21d5fdda309ec79b66963bc675a8c00d21756fb64aa15e", + "B": "4ff72cd50d743488e70b9d92e02b9a7544c38b7b0bdb33538ec9dd8ecb9ffc00" + }, + "normalized_sha256": { + "A": "63daf5e6f7c67edd6238409c093cfad179c1564e658c323e92500930d83bfec7", + "B": "63daf5e6f7c67edd6238409c093cfad179c1564e658c323e92500930d83bfec7" + } + } + ], + "59:BOOK_DELTA:f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3871, + 3871 + ], + "content_length": [ + "3871", + "3871" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "75efe0a2fb6577b709b74995415c753021f098f224d81545b9ca06805c5d5ca4", + "B": "8d321f7b9bd8a42068b5d9812722a604cb0b5e42f884caafc7faa7bf7280b182" + }, + "normalized_sha256": { + "A": "59157b67295d11946056b37e6493134b17362ec4c2711266ef8d9727862822c7", + "B": "59157b67295d11946056b37e6493134b17362ec4c2711266ef8d9727862822c7" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 4245, + 4245 + ], + "content_length": [ + "4245", + "4245" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "fc05cf4194fbf34ac73df296a646ae44c9d89870155c528cd53385f98647a379", + "B": "a4b388b0b04806bcb73fea4f99b4eabceca72b0de965f7ebb16f652c0ef441d8" + }, + "normalized_sha256": { + "A": "18428cd16217f5544887312a7037a38c6405ff646606dcd63c94a91f5284caf8", + "B": "18428cd16217f5544887312a7037a38c6405ff646606dcd63c94a91f5284caf8" + } + } + ], + "60:TRADE:d0ac3d4c-2374-5690-8af5-b970448f91d3": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 503, + 503 + ], + "length": [ + 268, + 268 + ], + "content_length": [ + "268", + "268" + ], + "rows": 0, + "volatile_path_count": 1, + "volatile_path_patterns": [ + "('request_id',)" + ], + "sha256": { + "A": "2b09b6a63e9ddf4bc54b6dca6eb71bdfbf61836170176c0618cd34983c7a75f7", + "B": "6a25b36794f30e6b9c1148625ced0da1b82d5940633650ce7f6fd31218c3423f" + }, + "normalized_sha256": { + "A": "c66e60ce8bda7de8ea9bd3c6b89ff1d628923009bb9cf86558ed607f2688fef5", + "B": "c66e60ce8bda7de8ea9bd3c6b89ff1d628923009bb9cf86558ed607f2688fef5" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 503, + 503 + ], + "length": [ + 268, + 268 + ], + "content_length": [ + "268", + "268" + ], + "rows": 0, + "volatile_path_count": 1, + "volatile_path_patterns": [ + "('request_id',)" + ], + "sha256": { + "A": "23ae9b3e169db2ecc269e9b2e7b0778795d518918020e76a39244fc1876c2f2d", + "B": "826f9f7a3a44eb6511619f03d39d1809cd26e195dbe6477493c90659ced128be" + }, + "normalized_sha256": { + "A": "c66e60ce8bda7de8ea9bd3c6b89ff1d628923009bb9cf86558ed607f2688fef5", + "B": "c66e60ce8bda7de8ea9bd3c6b89ff1d628923009bb9cf86558ed607f2688fef5" + } + } + ], + "61:BOOK_DELTA:8482b54b-6d9d-5aad-abe8-e22447d183a1": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 8179, + 8179 + ], + "content_length": [ + "8179", + "8179" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "d41edc68585e8ed8a91c8dc6d9b9716901db82c27142379afecb38946a667e83", + "B": "cac1491fd98fb562856c7eea280c3959e7e11db9545c8e28b4a0461fb9908ea0" + }, + "normalized_sha256": { + "A": "413db40baa80621660aa78c52dbead21b2cf41628c9c07088b86a02363b42c2c", + "B": "413db40baa80621660aa78c52dbead21b2cf41628c9c07088b86a02363b42c2c" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 12661, + 12661 + ], + "content_length": [ + "12661", + "12661" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "06b31d11ad1d4dc622becf32cc1bbdb1d6761661f101bb75ffd66b34ea8c5bba", + "B": "f12486ee160ee622480dbd5f14d5d3c4dc8415fd17c1e44f9aac3c8fb428397f" + }, + "normalized_sha256": { + "A": "0f36fb10e4cbe9e40c8c493cea17c71846835bd127dcd4b74bad0d29b4c7dc5c", + "B": "0f36fb10e4cbe9e40c8c493cea17c71846835bd127dcd4b74bad0d29b4c7dc5c" + } + } + ], + "62:BOOK_SNAPSHOT:8482b54b-6d9d-5aad-abe8-e22447d183a1": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 41043, + 41043 + ], + "content_length": [ + "41043", + "41043" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "84b616676ae3480c593bb63f1b99667904db4747563a67092a1ebcadbf1d6ea0", + "B": "6bd01ce8595ae0c2914b466d8b0aecbd97be44d76fb6ae29c00ab8dd1b8d1c69" + }, + "normalized_sha256": { + "A": "58796766c65544a4bc4b74d2304aa2fd329fb55a1f890f95696699e00eb75f4b", + "B": "58796766c65544a4bc4b74d2304aa2fd329fb55a1f890f95696699e00eb75f4b" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 41051, + 41051 + ], + "content_length": [ + "41051", + "41051" + ], + "rows": 1, + "volatile_path_count": 4, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "02e3077a94816db5546bc9d5c5ae2168716c903f15d3d647e55b89be9c6067bb", + "B": "b29e16d708ad063b4b3245d08aa3c79325bae4fdbf34e1c125bcb7174c063077" + }, + "normalized_sha256": { + "A": "b3151023fef2c7e96346e09ae80f5ebce2e2d8d26534020827bf36960913d24c", + "B": "b3151023fef2c7e96346e09ae80f5ebce2e2d8d26534020827bf36960913d24c" + } + } + ], + "63:MARK_INDEX_PRICE:8482b54b-6d9d-5aad-abe8-e22447d183a1": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3522, + 3522 + ], + "content_length": [ + "3522", + "3522" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "b71c46e392477da6995eb30f9646507673c69ec4ce82e7c4ead61f86294f34af", + "B": "4592c73c75ebf79c374a1822691dc167f46e59cc014728945995997f16eff8be" + }, + "normalized_sha256": { + "A": "1e5e70caf65d997f4781ee0f2b891c235dd680039dc20f343886011a9670ff6e", + "B": "1e5e70caf65d997f4781ee0f2b891c235dd680039dc20f343886011a9670ff6e" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3518, + 3518 + ], + "content_length": [ + "3518", + "3518" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "cda292edb4aaa9091d42ab8410999236272dc39211543fc1ac6bab4f1f94fd11", + "B": "67a72c30cbad7e512b2bfd2f5dc60d2ad8ccb8f38eb144c877ccb632ba4e5380" + }, + "normalized_sha256": { + "A": "b1c0602edcadbcda8da6380dbb8e53a694930808c6a6f91eac30ff89232eb53c", + "B": "b1c0602edcadbcda8da6380dbb8e53a694930808c6a6f91eac30ff89232eb53c" + } + } + ], + "64:QUOTE:8482b54b-6d9d-5aad-abe8-e22447d183a1": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3613, + 3613 + ], + "content_length": [ + "3613", + "3613" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "4df5153bc3c6372af2b5379262999c8199798569336eda616b95e79a5f60a1ef", + "B": "494be7493a2e4a2732a6efc4dbbba08bee54a65f5910c9a76aacbf7c1913867e" + }, + "normalized_sha256": { + "A": "2a246d74d9be957c2d205c0672dbe428e927d38b9a73eca7178fb3e3ebc157bb", + "B": "2a246d74d9be957c2d205c0672dbe428e927d38b9a73eca7178fb3e3ebc157bb" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 3615, + 3615 + ], + "content_length": [ + "3615", + "3615" + ], + "rows": 1, + "volatile_path_count": 5, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('data', *, 'quality', 'provider_session_liveness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "5dcdb86e03cc16803996c4d667c1f73f216ece3a16cb53f36ebaab3d7d4c4bb2", + "B": "95519f6122a60436b6f7864eedb3b52b876020af316eb6e473d83a8c84170938" + }, + "normalized_sha256": { + "A": "46dce076a044b575a32efcc22f37263c549baacf55508705aa213e3a114ff53f", + "B": "46dce076a044b575a32efcc22f37263c549baacf55508705aa213e3a114ff53f" + } + } + ] + } +} diff --git a/upgrade/evidence/releases/v2.2.5/query-ab-20261020/compare-rerun.json b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/compare-rerun.json new file mode 100644 index 00000000..92bd5077 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/compare-rerun.json @@ -0,0 +1,45 @@ +{ + "schema": "qdl.v225.query-ab-prereg.v2", + "revision_note": "v2 (before any run) replaces v1 of commit 7d28d9cb: owner 2026-10-20 ~04:30Z: run concurrently with a foreign correctness-only lock, interleave arms, judge paired old-vs-new deltas, record foreign activity", + "images": { + "A_old": "sha256:3e9e4d3add0f35c5d4b4796c785a35b466c326d3328184f396182b5f51367fff", + "B_new": "sha256:753604f8abaa866e2de30c7ccaf36168986bc6991550ee326d53e51b83d1550a" + }, + "replica": "one Query replica per arm, production container spec of query_kn_1 except private cache/quota Redis, --cpus 1.0 --memory 2g (the IDR-129 arm shape)", + "order": "byte compare (A and B side by side), then interleaved arms A1 B1 A2 B2 (A = old, B = new), each a fresh replica", + "concurrency": "runs beside another agent's correctness-only job under its host lock (owner instruction); foreign activity sampled every 30 s", + "burst": { + "slices": 64, + "bursts": 6, + "gap_s": 10, + "settle_s": 5, + "rounds": 4, + "mix": "TS r11 BAR 1m x 1,000 rows (10 slices) + alpha-okx BAR 1m..1h cycled to 54 slices with rows 2500/5000/2500/5000/2500/5000/2500/10000 (the IDR-129 stage ladder); SDK 2.4 redirect/queued retry shape", + "note": "alpha-binance identities belong to the rotated CA, so alpha slices are alpha-okx only" + }, + "hot_reads": { + "driver": "open loop, fixed schedule (no coordinated omission), TS identity", + "request": "GET /v2/market-data/{uid}/snapshot, TS r11 QUOTE and TRADE requirements (EXECUTION), round robin", + "rate_hz": 10.0, + "rate_note": "4x the production rate so that a ~150 ms maintenance run overlaps reads (about 1.5 expected per run)", + "production_reference": "R4 soak 2026-10-20: 7261 QUOTE + 1800 TRADE in 60 min = 2.5/s over two replicas", + "phases": "pre (60 s before burst 1), scored (first burst start .. last burst end), post (60 s)" + }, + "maintenance": "the new image's default QDL_QUERY_MEMORY_SOFT_LIMIT_MIB (448); no manual gc/trim in any scored arm", + "rules": { + "HR1": "paired deltas over the pairs (A1,B1) and (A2,B2), scored hot reads (any HTTP status; transport errors counted apart): mean(p95_Bi - p95_Ai) <= max(0.10*mean(p95_Ai), 10 ms) and mean(p99_Bi - p99_Ai) <= max(0.10*mean(p99_Ai), 25 ms); each pair is reported", + "HR2": "coverage: the B arms together have >= 1 memory_maintenance run inside a scored window with >= 1 hot read overlapping it; otherwise INCONCLUSIVE (never PASS)", + "HR3": "bounded pause: every hot read overlapping a maintenance run has latency <= run_ms + p99 of that arm's non-overlapping scored reads + 50 ms, and every run_ms <= 500", + "HR4": "transport errors + HTTP 5xx summed over B arms <= summed over A arms + max(2, 0.5 % of the B arms' scored reads)", + "HR5": "non-200 share of scored reads over the B arms <= over the A arms + 1 percentage point", + "BC": "for every TS r11 requirement, in each of 2 passes, a valid triple (A, B, A' = second request to A, issued together with the sync paused) exists within 3 attempts; valid = A and A' differ only in scalar leaves (V); PASS when for every valid triple: status A == B, content-type A == B, Content-Length header == body length on A and B, no Transfer-Encoding, the JSON leaf paths where A and B differ are a subset of V, and the bodies are byte-equal after replacing the raw values at V by one placeholder", + "verdict": "PASS only when HR1-HR5 and BC all PASS; INCONCLUSIVE when HR2 is not met; FAIL otherwise", + "secondary": "RSS per burst, warmup latency, 429 counts and failed slices are reported, not gated" + }, + "written_utc": "2026-10-20T05:44:47Z", + "tool": "scripts/v225_query_hot_read_ab.py", + "tool_commit": "b5b36e7272de06bc5e230d22eef7c96e64bf0374", + "concurrent_mode": true, + "tool_sha256": "48b7f80b5e679b5506178bdd0b25ef19264fee97c783aa2a0b41accd9686b01f", + "rerun_reason": "attempt-3 BC raw record lost: /out not writable for the capped root driver (harness b5b36e72 fix)" +} diff --git a/upgrade/evidence/releases/v2.2.5/query-ab-20261020/foreign.jsonl b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/foreign.jsonl new file mode 100644 index 00000000..e01d90ae --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/foreign.jsonl @@ -0,0 +1,93 @@ +{"utc": "2026-10-20T05:04:20Z", "unix_ms": 1792472660268.636, "loadavg": "11.09 11.00 10.57 5/2471 2761142", "running_containers": 42, "ours": 0, "foreign_test_like": ["control-api-test-node-2756921", "control-api-test-postgres-2756921", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.97 avg60=5.15 avg300=3.77 total=269572074052", "psi_memory": "some avg10=0.01 avg60=0.02 avg300=0.00 total=1210014762", "psi_io": "some avg10=12.24 avg60=12.84 avg300=12.34 total=346578254061", "lock": null} +{"utc": "2026-10-20T05:04:50Z", "unix_ms": 1792472690368.355, "loadavg": "11.13 11.02 10.59 3/2625 2763350", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-2756921", "control-api-test-postgres-2756921", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.75 avg60=4.73 avg300=3.81 total=269573436838", "psi_memory": "some avg10=0.00 avg60=0.01 avg300=0.00 total=1210018124", "psi_io": "some avg10=12.15 avg60=12.56 avg300=12.32 total=346582066369", "lock": null} +{"utc": "2026-10-20T05:05:20Z", "unix_ms": 1792472720486.091, "loadavg": "10.29 10.84 10.54 5/2626 2764891", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-2756921", "control-api-test-postgres-2756921", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=4.40 avg60=4.24 avg300=3.76 total=269574584037", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210048030", "psi_io": "some avg10=11.23 avg60=12.19 avg300=12.25 total=346585766876", "lock": null} +{"utc": "2026-10-20T05:05:50Z", "unix_ms": 1792472750598.9426, "loadavg": "11.02 10.98 10.60 6/2625 2766374", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-2756921", "control-api-test-postgres-2756921", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=6.02 avg60=4.86 avg300=3.96 total=269576451336", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210056632", "psi_io": "some avg10=12.06 avg60=12.10 avg300=12.22 total=346589525576", "lock": null} +{"utc": "2026-10-20T05:06:20Z", "unix_ms": 1792472780704.0269, "loadavg": "10.32 10.82 10.56 3/2629 2767790", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-2756921", "control-api-test-postgres-2756921", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=7.07 avg60=5.57 avg300=4.22 total=269578584351", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210059438", "psi_io": "some avg10=12.23 avg60=12.14 avg300=12.21 total=346593333700", "lock": null} +{"utc": "2026-10-20T05:06:50Z", "unix_ms": 1792472810826.1187, "loadavg": "10.77 10.87 10.58 8/2626 2769300", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-2756921", "control-api-test-postgres-2756921", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=5.54 avg60=5.43 avg300=4.31 total=269580273556", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210060461", "psi_io": "some avg10=12.24 avg60=12.18 avg300=12.21 total=346597213328", "lock": null} +{"utc": "2026-10-20T05:07:20Z", "unix_ms": 1792472840949.3213, "loadavg": "11.16 10.99 10.63 9/2630 2770779", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-2756921", "control-api-test-postgres-2756921", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.58 avg60=4.79 avg300=4.26 total=269581562845", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210063350", "psi_io": "some avg10=11.93 avg60=12.10 avg300=12.19 total=346600985940", "lock": null} +{"utc": "2026-10-20T05:07:51Z", "unix_ms": 1792472871070.0662, "loadavg": "11.60 11.10 10.68 3/2630 2772363", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-2756921", "control-api-test-postgres-2756921", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=6.33 avg60=4.82 avg300=4.30 total=269583155477", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210073279", "psi_io": "some avg10=11.72 avg60=11.97 avg300=12.15 total=346604691688", "lock": null} +{"utc": "2026-10-20T05:08:21Z", "unix_ms": 1792472901190.8708, "loadavg": "11.47 11.11 10.70 7/2634 2773903", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-2756921", "control-api-test-postgres-2756921", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=5.57 avg60=5.16 avg300=4.43 total=269584999120", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210086157", "psi_io": "some avg10=11.45 avg60=11.82 avg300=12.09 total=346608336431", "lock": null} +{"utc": "2026-10-20T05:08:51Z", "unix_ms": 1792472931321.217, "loadavg": "10.52 10.92 10.65 7/2638 2775485", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-2756921", "control-api-test-postgres-2756921", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.93 avg60=4.65 avg300=4.38 total=269586339946", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210086166", "psi_io": "some avg10=12.11 avg60=11.96 avg300=12.10 total=346612141725", "lock": null} +{"utc": "2026-10-20T05:09:21Z", "unix_ms": 1792472961480.662, "loadavg": "12.16 11.24 10.76 9/2576 2777567", "running_containers": 47, "ours": 5, "foreign_test_like": ["control-api-test-node-2756921", "control-api-test-postgres-2756921", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=6.59 avg60=5.17 avg300=4.52 total=269588262434", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210087302", "psi_io": "some avg10=12.01 avg60=12.05 avg300=12.11 total=346615951148", "lock": null} +{"utc": "2026-10-20T05:09:51Z", "unix_ms": 1792472991593.0247, "loadavg": "12.86 11.49 10.86 3/2507 2779362", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.04 avg60=3.86 avg300=4.26 total=269588977283", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210088614", "psi_io": "some avg10=12.51 avg60=12.30 avg300=12.16 total=346619972972", "lock": null} +{"utc": "2026-10-20T05:10:21Z", "unix_ms": 1792473021691.7546, "loadavg": "11.86 11.38 10.84 5/2508 2780798", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.47 avg60=2.96 avg300=3.99 total=269589631273", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210090371", "psi_io": "some avg10=12.19 avg60=12.32 avg300=12.19 total=346623814666", "lock": null} +{"utc": "2026-10-20T05:10:51Z", "unix_ms": 1792473051824.0515, "loadavg": "11.49 11.32 10.84 9/2555 2783107", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.11 avg60=2.94 avg300=3.88 total=269590601436", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210090375", "psi_io": "some avg10=12.08 avg60=12.20 avg300=12.17 total=346627563243", "lock": null} +{"utc": "2026-10-20T05:11:21Z", "unix_ms": 1792473081969.027, "loadavg": "11.29 11.32 10.86 7/2538 2784648", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.00 avg60=3.05 avg300=3.82 total=269591740539", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210091584", "psi_io": "some avg10=12.25 avg60=12.12 avg300=12.14 total=346631296191", "lock": null} +{"utc": "2026-10-20T05:11:52Z", "unix_ms": 1792473112161.9373, "loadavg": "11.18 11.27 10.85 22/2579 2790107", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.39 avg60=3.10 avg300=3.75 total=269592890805", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210093348", "psi_io": "some avg10=11.78 avg60=12.09 avg300=12.13 total=346635096357", "lock": null} +{"utc": "2026-10-20T05:12:22Z", "unix_ms": 1792473142283.563, "loadavg": "11.59 11.37 10.90 9/2542 2794736", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.90 avg60=3.47 avg300=3.78 total=269594255956", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210094743", "psi_io": "some avg10=13.29 avg60=12.44 avg300=12.21 total=346639097786", "lock": null} +{"utc": "2026-10-20T05:12:52Z", "unix_ms": 1792473172423.254, "loadavg": "11.20 11.30 10.89 8/2603 2796995", "running_containers": 47, "ours": 6, "foreign_test_like": ["contracts-test-node", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.16 avg60=3.27 avg300=3.70 total=269595277135", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210097240", "psi_io": "some avg10=13.07 avg60=12.74 avg300=12.30 total=346643172280", "lock": null} +{"utc": "2026-10-20T05:13:22Z", "unix_ms": 1792473202565.6213, "loadavg": "12.23 11.57 11.00 18/2591 2799280", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-epg08-final-20261020-0510", "control-api-test-postgres-epg08-final-20261020-0510", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=7.74 avg60=4.43 avg300=3.93 total=269597309141", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210098519", "psi_io": "some avg10=13.84 avg60=13.31 avg300=12.48 total=346647579923", "lock": null} +{"utc": "2026-10-20T05:13:52Z", "unix_ms": 1792473232672.3813, "loadavg": "11.76 11.51 11.00 4/2623 2800795", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-epg08-final-20261020-0510", "control-api-test-postgres-epg08-final-20261020-0510", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=7.36 avg60=6.35 avg300=4.49 total=269600248689", "psi_memory": "some avg10=0.09 avg60=0.02 avg300=0.00 total=1210153647", "psi_io": "some avg10=11.56 avg60=12.57 avg300=12.37 total=346651156646", "lock": null} +{"utc": "2026-10-20T05:14:22Z", "unix_ms": 1792473262773.4578, "loadavg": "12.03 11.61 11.05 12/2624 2802243", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-epg08-final-20261020-0510", "control-api-test-postgres-epg08-final-20261020-0510", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.74 avg60=4.96 avg300=4.33 total=269601184979", "psi_memory": "some avg10=0.00 avg60=0.01 avg300=0.00 total=1210154580", "psi_io": "some avg10=11.28 avg60=12.01 avg300=12.25 total=346654680428", "lock": null} +{"utc": "2026-10-20T05:14:52Z", "unix_ms": 1792473292881.1934, "loadavg": "11.43 11.53 11.04 3/2618 2803673", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-epg08-final-20261020-0510", "control-api-test-postgres-epg08-final-20261020-0510", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.72 avg60=3.71 avg300=4.07 total=269601856216", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210156157", "psi_io": "some avg10=11.74 avg60=11.86 avg300=12.18 total=346658346132", "lock": null} +{"utc": "2026-10-20T05:15:23Z", "unix_ms": 1792473323030.0154, "loadavg": "11.48 11.50 11.04 6/2627 2805135", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-epg08-final-20261020-0510", "control-api-test-postgres-epg08-final-20261020-0510", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.75 avg60=3.81 avg300=4.06 total=269603231388", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210159513", "psi_io": "some avg10=11.30 avg60=11.69 avg300=12.11 total=346661938886", "lock": null} +{"utc": "2026-10-20T05:15:53Z", "unix_ms": 1792473353167.452, "loadavg": "11.95 11.57 11.08 6/2610 2806622", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-epg08-final-20261020-0510", "control-api-test-postgres-epg08-final-20261020-0510", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.34 avg60=3.59 avg300=3.98 total=269604396025", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210162181", "psi_io": "some avg10=11.32 avg60=11.57 avg300=12.03 total=346665525660", "lock": null} +{"utc": "2026-10-20T05:16:23Z", "unix_ms": 1792473383299.3599, "loadavg": "12.59 11.77 11.16 9/2650 2808226", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-epg08-final-20261020-0510", "control-api-test-postgres-epg08-final-20261020-0510", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=6.44 avg60=4.56 avg300=4.17 total=269606252263", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210178332", "psi_io": "some avg10=11.43 avg60=11.61 avg300=12.00 total=346669227730", "lock": null} +{"utc": "2026-10-20T05:16:53Z", "unix_ms": 1792473413435.7085, "loadavg": "12.51 11.83 11.20 11/2627 2809790", "running_containers": 48, "ours": 6, "foreign_test_like": ["control-api-test-node-epg08-final-20261020-0510", "control-api-test-postgres-epg08-final-20261020-0510", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=5.12 avg60=4.68 avg300=4.24 total=269607827381", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210180810", "psi_io": "some avg10=11.66 avg60=11.65 avg300=11.97 total=346672918446", "lock": null} +{"utc": "2026-10-20T05:17:23Z", "unix_ms": 1792473443558.4116, "loadavg": "12.16 11.78 11.21 9/2587 2811389", "running_containers": 47, "ours": 5, "foreign_test_like": ["control-api-test-node-epg08-final-20261020-0510", "control-api-test-postgres-epg08-final-20261020-0510", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=5.11 avg60=4.82 avg300=4.31 total=269609499224", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210183478", "psi_io": "some avg10=11.49 avg60=11.65 avg300=11.94 total=346676567192", "lock": null} +{"utc": "2026-10-20T05:17:53Z", "unix_ms": 1792473473691.7458, "loadavg": "11.80 11.69 11.19 9/2578 2813015", "running_containers": 47, "ours": 5, "foreign_test_like": ["control-api-test-node-epg08-final-20261020-0510", "control-api-test-postgres-epg08-final-20261020-0510", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=4.70 avg60=4.60 avg300=4.31 total=269610933691", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210184085", "psi_io": "some avg10=11.89 avg60=11.74 avg300=11.94 total=346680252238", "lock": null} +{"utc": "2026-10-20T05:18:23Z", "unix_ms": 1792473503811.4143, "loadavg": "11.68 11.68 11.20 11/2591 2815008", "running_containers": 47, "ours": 5, "foreign_test_like": ["control-api-test-node-epg08-final-20261020-0510", "control-api-test-postgres-epg08-final-20261020-0510", "live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=6.81 avg60=5.10 avg300=4.44 total=269612781729", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210186714", "psi_io": "some avg10=12.25 avg60=11.79 avg300=11.93 total=346683966229", "lock": null} +{"utc": "2026-10-20T05:18:53Z", "unix_ms": 1792473533927.789, "loadavg": "10.32 11.36 11.11 9/2517 2817360", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.29 avg60=4.06 avg300=4.26 total=269613641169", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210188920", "psi_io": "some avg10=11.84 avg60=11.96 avg300=11.97 total=346687801875", "lock": null} +{"utc": "2026-10-20T05:19:24Z", "unix_ms": 1792473564020.4082, "loadavg": "10.13 11.21 11.07 2/2516 2818754", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.35 avg60=3.01 avg300=3.97 total=269614210022", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210191093", "psi_io": "some avg10=11.57 avg60=11.81 avg300=11.93 total=346691469390", "lock": null} +{"utc": "2026-10-20T05:19:54Z", "unix_ms": 1792473594142.325, "loadavg": "9.48 10.95 10.99 9/2548 2820379", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.95 avg60=2.58 avg300=3.77 total=269614928680", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210192532", "psi_io": "some avg10=11.47 avg60=11.72 avg300=11.90 total=346695113152", "lock": null} +{"utc": "2026-10-20T05:20:24Z", "unix_ms": 1792473624244.903, "loadavg": "9.18 10.72 10.91 6/2538 2821848", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.23 avg60=3.02 avg300=3.77 total=269616214954", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210194567", "psi_io": "some avg10=11.35 avg60=11.52 avg300=11.83 total=346698640312", "lock": null} +{"utc": "2026-10-20T05:20:54Z", "unix_ms": 1792473654386.5925, "loadavg": "9.30 10.60 10.86 13/2552 2823318", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.13 avg60=2.56 avg300=3.57 total=269616930485", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210197080", "psi_io": "some avg10=11.90 avg60=11.64 avg300=11.83 total=346702361581", "lock": null} +{"utc": "2026-10-20T05:21:24Z", "unix_ms": 1792473684490.169, "loadavg": "9.94 10.62 10.85 2/2530 2824717", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.24 avg60=2.51 avg300=3.46 total=269617795384", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210199380", "psi_io": "some avg10=11.34 avg60=11.58 avg300=11.80 total=346705980808", "lock": null} +{"utc": "2026-10-20T05:21:54Z", "unix_ms": 1792473714607.037, "loadavg": "9.40 10.40 10.77 5/2568 2826422", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.06 avg60=2.57 avg300=3.37 total=269618756971", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210201044", "psi_io": "some avg10=11.70 avg60=11.66 avg300=11.80 total=346709623202", "lock": null} +{"utc": "2026-10-20T05:22:24Z", "unix_ms": 1792473744733.752, "loadavg": "11.49 10.81 10.90 10/2530 2827814", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.00 avg60=2.40 avg300=3.25 total=269619570020", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210203368", "psi_io": "some avg10=11.51 avg60=11.60 avg300=11.77 total=346713254784", "lock": null} +{"utc": "2026-10-20T05:22:54Z", "unix_ms": 1792473774872.9956, "loadavg": "10.63 10.67 10.85 6/2572 2829296", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.22 avg60=2.22 avg300=3.12 total=269620286147", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210209061", "psi_io": "some avg10=11.59 avg60=11.67 avg300=11.77 total=346716918242", "lock": null} +{"utc": "2026-10-20T05:23:25Z", "unix_ms": 1792473805018.988, "loadavg": "10.78 10.70 10.86 12/2539 2830716", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.39 avg60=2.31 avg300=3.05 total=269621203778", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210215542", "psi_io": "some avg10=11.20 avg60=11.57 avg300=11.74 total=346720561272", "lock": null} +{"utc": "2026-10-20T05:23:55Z", "unix_ms": 1792473835136.8533, "loadavg": "11.12 10.77 10.87 3/2519 2832141", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.84 avg60=2.08 avg300=2.92 total=269621856668", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210222540", "psi_io": "some avg10=11.58 avg60=11.58 avg300=11.73 total=346724199090", "lock": null} +{"utc": "2026-10-20T05:24:25Z", "unix_ms": 1792473865291.1423, "loadavg": "11.63 10.95 10.93 4/2534 2833593", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.62 avg60=2.31 avg300=2.90 total=269622823836", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210229854", "psi_io": "some avg10=11.14 avg60=11.40 avg300=11.67 total=346727712089", "lock": null} +{"utc": "2026-10-20T05:24:55Z", "unix_ms": 1792473895420.1228, "loadavg": "11.54 11.01 10.95 3/2525 2835077", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.38 avg60=2.05 avg300=2.78 total=269623500038", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210236101", "psi_io": "some avg10=11.08 avg60=11.34 avg300=11.62 total=346731318914", "lock": null} +{"utc": "2026-10-20T05:25:25Z", "unix_ms": 1792473925561.367, "loadavg": "11.49 11.05 10.97 6/2533 2836501", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.51 avg60=2.29 avg300=2.77 total=269624466178", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210242279", "psi_io": "some avg10=11.20 avg60=11.34 avg300=11.60 total=346734911701", "lock": null} +{"utc": "2026-10-20T05:25:55Z", "unix_ms": 1792473955687.3657, "loadavg": "10.79 10.93 10.93 8/2528 2838015", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.04 avg60=2.15 avg300=2.68 total=269625150659", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210246395", "psi_io": "some avg10=11.76 avg60=11.54 avg300=11.63 total=346738615324", "lock": null} +{"utc": "2026-10-20T05:26:25Z", "unix_ms": 1792473985800.5305, "loadavg": "11.45 11.07 10.98 14/2507 2839557", "running_containers": 45, "ours": 5, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.44 avg60=1.98 avg300=2.59 total=269625841284", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210251985", "psi_io": "some avg10=11.99 avg60=11.72 avg300=11.67 total=346742348381", "lock": null} +{"utc": "2026-10-20T05:26:55Z", "unix_ms": 1792474015900.413, "loadavg": "10.57 10.90 10.92 6/2507 2841063", "running_containers": 45, "ours": 5, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.45 avg60=1.76 avg300=2.47 total=269626410333", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210255238", "psi_io": "some avg10=11.68 avg60=11.75 avg300=11.68 total=346746018505", "lock": null} +{"utc": "2026-10-20T05:27:26Z", "unix_ms": 1792474046009.7954, "loadavg": "9.95 10.73 10.87 4/2512 2843042", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.86 avg60=2.48 avg300=2.59 total=269627709766", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210259988", "psi_io": "some avg10=12.37 avg60=11.90 avg300=11.72 total=346749783606", "lock": null} +{"utc": "2026-10-20T05:27:56Z", "unix_ms": 1792474076121.8257, "loadavg": "9.03 10.41 10.76 3/2519 2844499", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.34 avg60=2.01 avg300=2.46 total=269628290179", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210260453", "psi_io": "some avg10=11.82 avg60=11.86 avg300=11.73 total=346753484359", "lock": null} +{"utc": "2026-10-20T05:28:26Z", "unix_ms": 1792474106230.71, "loadavg": "8.52 10.19 10.67 6/2576 2845986", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.40 avg60=2.08 avg300=2.43 total=269629052151", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210262323", "psi_io": "some avg10=11.47 avg60=11.72 avg300=11.71 total=346757110397", "lock": null} +{"utc": "2026-10-20T05:28:56Z", "unix_ms": 1792474136344.841, "loadavg": "8.22 9.96 10.58 10/2553 2847436", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.41 avg60=2.12 avg300=2.40 total=269629825802", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210264761", "psi_io": "some avg10=11.52 avg60=11.60 avg300=11.68 total=346760667007", "lock": null} +{"utc": "2026-10-20T05:29:26Z", "unix_ms": 1792474166479.3052, "loadavg": "9.02 9.98 10.57 9/2580 2848874", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.91 avg60=2.03 avg300=2.35 total=269630591235", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210266512", "psi_io": "some avg10=11.40 avg60=11.50 avg300=11.64 total=346764230383", "lock": null} +{"utc": "2026-10-20T05:29:56Z", "unix_ms": 1792474196597.0068, "loadavg": "8.89 9.85 10.50 8/2559 2850320", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.29 avg60=2.16 avg300=2.35 total=269631435549", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210268835", "psi_io": "some avg10=11.51 avg60=11.46 avg300=11.62 total=346767825988", "lock": null} +{"utc": "2026-10-20T05:30:26Z", "unix_ms": 1792474226729.9739, "loadavg": "9.25 9.86 10.48 8/2585 2851792", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.25 avg60=2.33 avg300=2.38 total=269632384054", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210271810", "psi_io": "some avg10=11.64 avg60=11.54 avg300=11.63 total=346771552259", "lock": null} +{"utc": "2026-10-20T05:30:56Z", "unix_ms": 1792474256848.7021, "loadavg": "9.57 9.87 10.47 8/2554 2853264", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.22 avg60=2.31 avg300=2.37 total=269633255066", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210273944", "psi_io": "some avg10=12.07 avg60=11.77 avg300=11.68 total=346775364226", "lock": null} +{"utc": "2026-10-20T05:31:26Z", "unix_ms": 1792474286966.419, "loadavg": "8.90 9.72 10.40 12/2572 2854710", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.62 avg60=2.13 avg300=2.32 total=269633996176", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210275993", "psi_io": "some avg10=11.85 avg60=11.78 avg300=11.69 total=346779026407", "lock": null} +{"utc": "2026-10-20T05:31:57Z", "unix_ms": 1792474317093.5068, "loadavg": "9.02 9.68 10.36 4/2555 2856176", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.74 avg60=2.10 avg300=2.30 total=269634791667", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210277456", "psi_io": "some avg10=11.59 avg60=11.71 avg300=11.69 total=346782648059", "lock": null} +{"utc": "2026-10-20T05:32:27Z", "unix_ms": 1792474347219.6875, "loadavg": "9.36 9.69 10.34 6/2533 2857581", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.02 avg60=2.16 avg300=2.30 total=269635641955", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210279916", "psi_io": "some avg10=11.91 avg60=11.75 avg300=11.70 total=346786346499", "lock": null} +{"utc": "2026-10-20T05:32:57Z", "unix_ms": 1792474377341.7603, "loadavg": "10.64 9.99 10.42 7/2539 2859040", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.12 avg60=2.08 avg300=2.26 total=269636383020", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210281997", "psi_io": "some avg10=11.21 avg60=11.60 avg300=11.67 total=346789948346", "lock": null} +{"utc": "2026-10-20T05:33:27Z", "unix_ms": 1792474407446.0288, "loadavg": "11.13 10.19 10.48 5/2527 2860460", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.11 avg60=2.21 avg300=2.28 total=269637245384", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210284063", "psi_io": "some avg10=11.53 avg60=11.52 avg300=11.64 total=346793551132", "lock": null} +{"utc": "2026-10-20T05:33:57Z", "unix_ms": 1792474437582.9705, "loadavg": "11.52 10.38 10.53 5/2541 2861937", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.54 avg60=2.20 avg300=2.26 total=269638078645", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210286735", "psi_io": "some avg10=11.61 avg60=11.55 avg300=11.64 total=346797197877", "lock": null} +{"utc": "2026-10-20T05:34:27Z", "unix_ms": 1792474467682.3691, "loadavg": "11.59 10.50 10.57 8/2528 2863347", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.71 avg60=2.14 avg300=2.25 total=269638866285", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210288703", "psi_io": "some avg10=11.45 avg60=11.51 avg300=11.62 total=346800797695", "lock": null} +{"utc": "2026-10-20T05:34:57Z", "unix_ms": 1792474497787.1365, "loadavg": "10.31 10.28 10.49 11/2490 2864823", "running_containers": 45, "ours": 5, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.35 avg60=1.79 avg300=2.15 total=269639421643", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210290212", "psi_io": "some avg10=11.56 avg60=11.54 avg300=11.62 total=346804440362", "lock": null} +{"utc": "2026-10-20T05:35:27Z", "unix_ms": 1792474527898.509, "loadavg": "9.71 10.16 10.44 5/2491 2866228", "running_containers": 45, "ours": 5, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.59 avg60=1.71 avg300=2.09 total=269640050265", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210292299", "psi_io": "some avg10=11.79 avg60=11.57 avg300=11.62 total=346808066962", "lock": null} +{"utc": "2026-10-20T05:35:58Z", "unix_ms": 1792474558003.1018, "loadavg": "9.74 10.11 10.42 5/2507 2868112", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.45 avg60=2.09 avg300=2.14 total=269640981694", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210294016", "psi_io": "some avg10=11.79 avg60=11.62 avg300=11.63 total=346811756131", "lock": null} +{"utc": "2026-10-20T05:36:28Z", "unix_ms": 1792474588109.9912, "loadavg": "9.71 10.06 10.39 19/2507 2869519", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.04 avg60=2.05 avg300=2.13 total=269641753624", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210296933", "psi_io": "some avg10=12.66 avg60=11.92 avg300=11.70 total=346815612995", "lock": null} +{"utc": "2026-10-20T05:36:58Z", "unix_ms": 1792474618242.4614, "loadavg": "9.85 10.04 10.37 9/2575 2871024", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.61 avg60=2.15 avg300=2.14 total=269642583395", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210300931", "psi_io": "some avg10=12.61 avg60=12.30 avg300=11.82 total=346819636808", "lock": null} +{"utc": "2026-10-20T05:37:28Z", "unix_ms": 1792474648367.7693, "loadavg": "10.38 10.15 10.40 7/2539 2872427", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.88 avg60=2.59 avg300=2.26 total=269643705200", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210303376", "psi_io": "some avg10=12.28 avg60=12.33 avg300=11.89 total=346823562263", "lock": null} +{"utc": "2026-10-20T05:37:58Z", "unix_ms": 1792474678503.9712, "loadavg": "9.64 10.01 10.35 2/2546 2873847", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.80 avg60=2.52 avg300=2.27 total=269644546172", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210307639", "psi_io": "some avg10=12.01 avg60=12.28 avg300=11.93 total=346827383915", "lock": null} +{"utc": "2026-10-20T05:38:28Z", "unix_ms": 1792474708620.41, "loadavg": "10.18 10.12 10.37 3/2550 2875311", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.54 avg60=3.05 avg300=2.43 total=269645901078", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210321972", "psi_io": "some avg10=11.85 avg60=12.07 avg300=11.91 total=346831052350", "lock": null} +{"utc": "2026-10-20T05:38:58Z", "unix_ms": 1792474738756.6536, "loadavg": "10.79 10.27 10.41 11/2560 2876818", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.84 avg60=2.97 avg300=2.48 total=269646936102", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210335624", "psi_io": "some avg10=12.14 avg60=12.09 avg300=11.93 total=346834843360", "lock": null} +{"utc": "2026-10-20T05:39:28Z", "unix_ms": 1792474768915.4456, "loadavg": "10.06 10.13 10.36 15/2555 2878254", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=3.50 avg60=3.12 avg300=2.56 total=269648109114", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210349157", "psi_io": "some avg10=12.37 avg60=12.19 avg300=11.97 total=346838715602", "lock": null} +{"utc": "2026-10-20T05:39:59Z", "unix_ms": 1792474799021.6255, "loadavg": "10.18 10.17 10.37 15/2542 2879843", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.57 avg60=2.99 avg300=2.59 total=269649095450", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210364066", "psi_io": "some avg10=12.29 avg60=12.24 avg300=12.01 total=346842589561", "lock": null} +{"utc": "2026-10-20T05:40:29Z", "unix_ms": 1792474829120.8896, "loadavg": "9.45 10.01 10.31 3/2549 2881368", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.73 avg60=2.89 avg300=2.60 total=269650072248", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210375981", "psi_io": "some avg10=12.18 avg60=12.21 avg300=12.02 total=346846411831", "lock": null} +{"utc": "2026-10-20T05:40:59Z", "unix_ms": 1792474859252.2703, "loadavg": "9.52 9.98 10.29 4/2555 2882864", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.43 avg60=2.65 avg300=2.57 total=269650919876", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210388673", "psi_io": "some avg10=12.08 avg60=12.18 avg300=12.03 total=346850260633", "lock": null} +{"utc": "2026-10-20T05:41:29Z", "unix_ms": 1792474889374.7827, "loadavg": "11.45 10.40 10.42 8/2590 2884356", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.62 avg60=2.53 avg300=2.55 total=269651788146", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210405182", "psi_io": "some avg10=12.07 avg60=12.15 avg300=12.04 total=346854022007", "lock": null} +{"utc": "2026-10-20T05:41:59Z", "unix_ms": 1792474919494.2473, "loadavg": "11.50 10.48 10.44 2/2558 2885960", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.22 avg60=2.44 avg300=2.52 total=269652655144", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210414762", "psi_io": "some avg10=12.11 avg60=12.16 avg300=12.06 total=346857840028", "lock": null} +{"utc": "2026-10-20T05:42:29Z", "unix_ms": 1792474949609.1306, "loadavg": "11.76 10.62 10.49 3/2582 2887487", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.46 avg60=2.46 avg300=2.52 total=269653556091", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210424743", "psi_io": "some avg10=12.18 avg60=12.19 avg300=12.07 total=346861694058", "lock": null} +{"utc": "2026-10-20T05:42:59Z", "unix_ms": 1792474979732.8762, "loadavg": "11.60 10.69 10.52 15/2566 2888948", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.06 avg60=2.30 avg300=2.47 total=269654326115", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210433474", "psi_io": "some avg10=11.92 avg60=12.08 avg300=12.06 total=346865428376", "lock": null} +{"utc": "2026-10-20T05:43:29Z", "unix_ms": 1792475009847.8374, "loadavg": "11.09 10.66 10.52 10/2507 2890461", "running_containers": 45, "ours": 5, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.61 avg60=2.60 avg300=2.55 total=269655384454", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210436794", "psi_io": "some avg10=12.03 avg60=12.04 avg300=12.05 total=346869183725", "lock": null} +{"utc": "2026-10-20T05:43:59Z", "unix_ms": 1792475039963.6511, "loadavg": "11.14 10.71 10.54 7/2518 2891996", "running_containers": 45, "ours": 5, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.34 avg60=2.47 avg300=2.52 total=269656200217", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210442371", "psi_io": "some avg10=12.07 avg60=12.00 avg300=12.04 total=346872923424", "lock": null} +{"utc": "2026-10-20T05:44:30Z", "unix_ms": 1792475070086.5017, "loadavg": "12.40 11.05 10.65 15/2440 2893587", "running_containers": 44, "ours": 4, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.36 avg60=2.52 avg300=2.53 total=269657206248", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210443678", "psi_io": "some avg10=11.69 avg60=11.91 avg300=12.01 total=346876608983", "lock": null} +{"utc": "2026-10-20T05:44:31Z", "unix_ms": 1792475071748.6138, "loadavg": "12.69 11.13 10.68 4/2379 2893863", "running_containers": 40, "ours": 0, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.66 avg60=2.57 avg300=2.54 total=269657265503", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210443914", "psi_io": "some avg10=11.93 avg60=11.94 avg300=12.01 total=346876853782", "lock": null, "phase": "after_cleanup"} +{"utc": "2026-10-20T05:44:47Z", "unix_ms": 1792475087963.2778, "loadavg": "13.26 11.34 10.76 11/2388 2894665", "running_containers": 40, "ours": 0, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.29 avg60=2.49 avg300=2.52 total=269657735500", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210444942", "psi_io": "some avg10=11.95 avg60=11.98 avg300=12.02 total=346878862027", "lock": null} +{"utc": "2026-10-20T05:45:18Z", "unix_ms": 1792475118065.5144, "loadavg": "13.09 11.48 10.82 3/2555 2896883", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=6.09 avg60=3.94 avg300=2.88 total=269659704739", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210449854", "psi_io": "some avg10=11.69 avg60=11.96 avg300=12.01 total=346882595297", "lock": null} +{"utc": "2026-10-20T05:45:48Z", "unix_ms": 1792475148177.557, "loadavg": "12.28 11.46 10.84 8/2559 2898424", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.86 avg60=3.08 avg300=2.77 total=269660379097", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210463319", "psi_io": "some avg10=12.72 avg60=12.24 avg300=12.08 total=346886573356", "lock": null} +{"utc": "2026-10-20T05:46:18Z", "unix_ms": 1792475178286.3975, "loadavg": "11.34 11.33 10.82 7/2560 2900012", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.18 avg60=2.69 avg300=2.70 total=269661155141", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210477034", "psi_io": "some avg10=12.75 avg60=12.37 avg300=12.12 total=346890531506", "lock": null} +{"utc": "2026-10-20T05:46:48Z", "unix_ms": 1792475208406.1755, "loadavg": "11.21 11.30 10.82 5/2556 2901575", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.51 avg60=2.31 avg300=2.61 total=269661800628", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210499152", "psi_io": "some avg10=11.93 avg60=12.25 avg300=12.12 total=346894358196", "lock": null} +{"utc": "2026-10-20T05:47:18Z", "unix_ms": 1792475238511.495, "loadavg": "11.69 11.44 10.89 6/2555 2903253", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.88 avg60=2.13 avg300=2.53 total=269662511224", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210499156", "psi_io": "some avg10=11.89 avg60=12.10 avg300=12.09 total=346898096443", "lock": null} +{"utc": "2026-10-20T05:47:48Z", "unix_ms": 1792475268613.0352, "loadavg": "11.98 11.51 10.93 4/2551 2905062", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.46 avg60=2.12 avg300=2.48 total=269663267381", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210502616", "psi_io": "some avg10=12.22 avg60=12.11 avg300=12.09 total=346901891732", "lock": null} +{"utc": "2026-10-20T05:48:18Z", "unix_ms": 1792475298712.2886, "loadavg": "12.34 11.64 10.99 4/2553 2907752", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=2.21 avg60=2.14 avg300=2.45 total=269664051141", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210510741", "psi_io": "some avg10=11.80 avg60=12.04 avg300=12.08 total=346905621637", "lock": null} +{"utc": "2026-10-20T05:48:48Z", "unix_ms": 1792475328827.3171, "loadavg": "11.73 11.55 10.98 11/2562 2909637", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.61 avg60=1.95 avg300=2.37 total=269664682627", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210522057", "psi_io": "some avg10=12.25 avg60=12.04 avg300=12.07 total=346909401399", "lock": null} +{"utc": "2026-10-20T05:49:18Z", "unix_ms": 1792475358993.303, "loadavg": "12.55 11.80 11.09 15/2576 2911766", "running_containers": 47, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1", "ts35-impact-unit"], "psi_cpu": "some avg10=2.74 avg60=2.45 avg300=2.47 total=269665863970", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210522138", "psi_io": "some avg10=11.61 avg60=11.91 avg300=12.04 total=346913117243", "lock": null} +{"utc": "2026-10-20T05:49:40Z", "unix_ms": 1792475380007.2566, "loadavg": "12.90 11.94 11.15 14/2400 2913189", "running_containers": 41, "ours": 0, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1", "ts35-impact-unit"], "psi_cpu": "some avg10=1.68 avg60=2.22 avg300=2.41 total=269666336607", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210522212", "psi_io": "some avg10=11.99 avg60=11.94 avg300=12.03 total=346915767763", "lock": null, "phase": "after_cleanup"} diff --git a/upgrade/evidence/releases/v2.2.5/query-ab-20261020/prereg.json b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/prereg.json new file mode 100644 index 00000000..c495c6bc --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/prereg.json @@ -0,0 +1,44 @@ +{ + "schema": "qdl.v225.query-ab-prereg.v2", + "revision_note": "v2 (before any run) replaces v1 of commit 7d28d9cb: owner 2026-10-20 ~04:30Z: run concurrently with a foreign correctness-only lock, interleave arms, judge paired old-vs-new deltas, record foreign activity", + "images": { + "A_old": "sha256:3e9e4d3add0f35c5d4b4796c785a35b466c326d3328184f396182b5f51367fff", + "B_new": "sha256:753604f8abaa866e2de30c7ccaf36168986bc6991550ee326d53e51b83d1550a" + }, + "replica": "one Query replica per arm, production container spec of query_kn_1 except private cache/quota Redis, --cpus 1.0 --memory 2g (the IDR-129 arm shape)", + "order": "byte compare (A and B side by side), then interleaved arms A1 B1 A2 B2 (A = old, B = new), each a fresh replica", + "concurrency": "runs beside another agent's correctness-only job under its host lock (owner instruction); foreign activity sampled every 30 s", + "burst": { + "slices": 64, + "bursts": 6, + "gap_s": 10, + "settle_s": 5, + "rounds": 4, + "mix": "TS r11 BAR 1m x 1,000 rows (10 slices) + alpha-okx BAR 1m..1h cycled to 54 slices with rows 2500/5000/2500/5000/2500/5000/2500/10000 (the IDR-129 stage ladder); SDK 2.4 redirect/queued retry shape", + "note": "alpha-binance identities belong to the rotated CA, so alpha slices are alpha-okx only" + }, + "hot_reads": { + "driver": "open loop, fixed schedule (no coordinated omission), TS identity", + "request": "GET /v2/market-data/{uid}/snapshot, TS r11 QUOTE and TRADE requirements (EXECUTION), round robin", + "rate_hz": 10.0, + "rate_note": "4x the production rate so that a ~150 ms maintenance run overlaps reads (about 1.5 expected per run)", + "production_reference": "R4 soak 2026-10-20: 7261 QUOTE + 1800 TRADE in 60 min = 2.5/s over two replicas", + "phases": "pre (60 s before burst 1), scored (first burst start .. last burst end), post (60 s)" + }, + "maintenance": "the new image's default QDL_QUERY_MEMORY_SOFT_LIMIT_MIB (448); no manual gc/trim in any scored arm", + "rules": { + "HR1": "paired deltas over the pairs (A1,B1) and (A2,B2), scored hot reads (any HTTP status; transport errors counted apart): mean(p95_Bi - p95_Ai) <= max(0.10*mean(p95_Ai), 10 ms) and mean(p99_Bi - p99_Ai) <= max(0.10*mean(p99_Ai), 25 ms); each pair is reported", + "HR2": "coverage: the B arms together have >= 1 memory_maintenance run inside a scored window with >= 1 hot read overlapping it; otherwise INCONCLUSIVE (never PASS)", + "HR3": "bounded pause: every hot read overlapping a maintenance run has latency <= run_ms + p99 of that arm's non-overlapping scored reads + 50 ms, and every run_ms <= 500", + "HR4": "transport errors + HTTP 5xx summed over B arms <= summed over A arms + max(2, 0.5 % of the B arms' scored reads)", + "HR5": "non-200 share of scored reads over the B arms <= over the A arms + 1 percentage point", + "BC": "for every TS r11 requirement, in each of 2 passes, a valid triple (A, B, A' = second request to A, issued together with the sync paused) exists within 3 attempts; valid = A and A' differ only in scalar leaves (V); PASS when for every valid triple: status A == B, content-type A == B, Content-Length header == body length on A and B, no Transfer-Encoding, the JSON leaf paths where A and B differ are a subset of V, and the bodies are byte-equal after replacing the raw values at V by one placeholder", + "verdict": "PASS only when HR1-HR5 and BC all PASS; INCONCLUSIVE when HR2 is not met; FAIL otherwise", + "secondary": "RSS per burst, warmup latency, 429 counts and failed slices are reported, not gated" + }, + "written_utc": "2026-10-20T05:04:20Z", + "tool": "scripts/v225_query_hot_read_ab.py", + "tool_commit": "543ddf1810713b198713549f669bd93e4ea996df", + "concurrent_mode": true, + "tool_sha256": "029ed68c95d4407e7fbd5c79ce0a36117ad0f98c195c33366d7b7f6034399305" +} diff --git a/upgrade/evidence/releases/v2.2.5/query-ab-20261020/receipt.json b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/receipt.json new file mode 100644 index 00000000..09461577 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/receipt.json @@ -0,0 +1,2742 @@ +{ + "schema": "qdl.v225.query-ab-receipt.v2", + "verdict": "PASS", + "rules": { + "HR1": { + "pairs": [ + { + "pair": [ + "A1", + "B1" + ], + "p95": [ + 186.017, + 122.887 + ], + "p99": [ + 437.8, + 391.721 + ], + "p50": [ + 17.344, + 16.752 + ], + "max": [ + 787.944, + 738.39 + ], + "d_p95": -63.129999999999995, + "d_p99": -46.07900000000001 + }, + { + "pair": [ + "A2", + "B2" + ], + "p95": [ + 173.093, + 152.42 + ], + "p99": [ + 399.425, + 406.579 + ], + "p50": [ + 17.287, + 16.893 + ], + "max": [ + 837.189, + 761.381 + ], + "d_p95": -20.673000000000002, + "d_p99": 7.153999999999996 + } + ], + "mean_d_p95": -41.9015, + "bound_p95": 17.9555, + "mean_d_p99": -19.462500000000006, + "bound_p99": 41.861250000000005, + "pass": true + }, + "HR2": { + "runs_total": 2, + "runs_covered": 1, + "pass": true + }, + "HR3": { + "runs": [ + { + "arm": "B1", + "run_ms": 130.709, + "worst_overlapping_ms": 44.7, + "bound_ms": 572.4300000000001, + "pass": true + }, + { + "arm": "B2", + "run_ms": 147.166, + "worst_overlapping_ms": 0, + "bound_ms": 603.745, + "pass": true + } + ], + "pass": true + }, + "HR4": { + "A": 387, + "B": 376, + "allowed": 424.9, + "pass": true + }, + "HR5": { + "A": 0.05104867431737238, + "B": 0.049604221635883905, + "pass": true + }, + "BC": { + "verdict": "PASS", + "problems": [], + "pass": true + } + }, + "concurrency": { + "mode": "CONCURRENT_WITH_FOREIGN_LOCK", + "samples": 93, + "load1_min_max": [ + 8.22, + 13.26 + ], + "psi_cpu_some_avg10_min_max": [ + 1.34, + 7.74 + ], + "locks_seen": [ + "null" + ], + "foreign_test_like_containers_seen": [ + "contracts-test-node", + "control-api-test-node-2756921", + "control-api-test-node-epg08-final-20261020-0510", + "control-api-test-postgres-2756921", + "control-api-test-postgres-epg08-final-20261020-0510", + "live_data_executor", + "redis_marketdata", + "redis_service", + "trading-system-manager-read-live-portal_manager_issuer-1", + "trading-system-manager-read-live-portal_manager_read-1", + "trading-system-manager-read-sandbox-portal_manager_issuer-1", + "trading-system-manager-read-sandbox-portal_manager_read-1", + "ts35-impact-unit" + ] + }, + "prereg_sha256": "0f2f00b43f1a1e28fedd055d90ca9f01dcd2376eb5e9d2053936b5cec081d924", + "prereg_written_utc": "2026-10-20T05:04:20Z", + "tool_commit": "543ddf1810713b198713549f669bd93e4ea996df", + "arms": { + "A1": { + "image": "sha256:3e9e4d3add0f35c5d4b4796c785a35b466c326d3328184f396182b5f51367fff", + "scored_window_ms": [ + 1792473024893.6301, + 1792473422137.0098 + ], + "pre": { + "n": 604, + "statuses": { + "200": 575, + "503": 29 + }, + "p50_ms": 8.057, + "p95_ms": 9.763, + "p99_ms": 11.451, + "max_ms": 71.855, + "ok200": { + "n": 575, + "p50_ms": 8.103, + "p95_ms": 9.844, + "p99_ms": 11.674, + "max_ms": 71.855 + } + }, + "scored": { + "n": 3972, + "statuses": { + "200": 3773, + "503": 199 + }, + "p50_ms": 17.344, + "p95_ms": 186.017, + "p99_ms": 437.8, + "max_ms": 787.944, + "ok200": { + "n": 3773, + "p50_ms": 17.47, + "p95_ms": 186.312, + "p99_ms": 437.8, + "max_ms": 787.944 + } + }, + "post": { + "n": 765, + "statuses": { + "200": 731, + "503": 34 + }, + "p50_ms": 8.428, + "p95_ms": 9.83, + "p99_ms": 10.882, + "max_ms": 24.625, + "ok200": { + "n": 731, + "p50_ms": 8.447, + "p95_ms": 9.84, + "p99_ms": 10.76, + "max_ms": 12.651 + } + }, + "scored_non_overlap": { + "n": 3972, + "statuses": { + "200": 3773, + "503": 199 + }, + "p50_ms": 17.344, + "p95_ms": 186.017, + "p99_ms": 437.8, + "max_ms": 787.944, + "ok200": { + "n": 3773, + "p50_ms": 17.47, + "p95_ms": 186.312, + "p99_ms": 437.8, + "max_ms": 787.944 + } + }, + "transport_or_5xx": 199, + "non200_share": 0.050100704934541794, + "maintenance_runs": [], + "bursts": [ + { + "burst": 1, + "wall_s": 58.8, + "statuses": { + "429": 1141, + "200": 25, + "TRANSPORT": 5 + }, + "failed_slices": 39, + "req200_ms_p50": 6213, + "rss_mib": 464.5, + "uordblks_mib": null + }, + { + "burst": 2, + "wall_s": 48.9, + "statuses": { + "429": 1175, + "200": 25, + "TRANSPORT": 3 + }, + "failed_slices": 39, + "req200_ms_p50": 6386, + "rss_mib": 531.3, + "uordblks_mib": null + }, + { + "burst": 3, + "wall_s": 56.8, + "statuses": { + "429": 1159, + "200": 25, + "TRANSPORT": 5 + }, + "failed_slices": 39, + "req200_ms_p50": 6399, + "rss_mib": 516.3, + "uordblks_mib": null + }, + { + "burst": 4, + "wall_s": 51.8, + "statuses": { + "429": 1108, + "200": 26, + "TRANSPORT": 5 + }, + "failed_slices": 38, + "req200_ms_p50": 7489, + "rss_mib": 489.1, + "uordblks_mib": null + }, + { + "burst": 5, + "wall_s": 49.9, + "statuses": { + "429": 1132, + "200": 26, + "TRANSPORT": 5 + }, + "failed_slices": 38, + "req200_ms_p50": 5385, + "rss_mib": 599.1, + "uordblks_mib": null + }, + { + "burst": 6, + "wall_s": 54.9, + "statuses": { + "429": 1077, + "200": 29, + "TRANSPORT": 5 + }, + "failed_slices": 35, + "req200_ms_p50": 6659, + "rss_mib": 608.1, + "uordblks_mib": null + } + ], + "schedule_lag_ms_p99": 2.0 + }, + "B1": { + "image": "sha256:753604f8abaa866e2de30c7ccaf36168986bc6991550ee326d53e51b83d1550a", + "scored_window_ms": [ + 1792473574027.611, + 1792473949049.7458 + ], + "pre": { + "n": 605, + "statuses": { + "200": 578, + "503": 27 + }, + "p50_ms": 8.112, + "p95_ms": 9.453, + "p99_ms": 10.3, + "max_ms": 72.174, + "ok200": { + "n": 578, + "p50_ms": 8.139, + "p95_ms": 9.497, + "p99_ms": 10.399, + "max_ms": 72.174 + } + }, + "scored": { + "n": 3750, + "statuses": { + "200": 3558, + "503": 192 + }, + "p50_ms": 16.752, + "p95_ms": 122.887, + "p99_ms": 391.721, + "max_ms": 738.39, + "ok200": { + "n": 3558, + "p50_ms": 16.848, + "p95_ms": 123.309, + "p99_ms": 396.016, + "max_ms": 738.39 + } + }, + "post": { + "n": 768, + "statuses": { + "200": 728, + "503": 40 + }, + "p50_ms": 8.262, + "p95_ms": 9.796, + "p99_ms": 11.163, + "max_ms": 11.93, + "ok200": { + "n": 728, + "p50_ms": 8.295, + "p95_ms": 9.831, + "p99_ms": 11.163, + "max_ms": 11.93 + } + }, + "scored_non_overlap": { + "n": 3748, + "statuses": { + "200": 3556, + "503": 192 + }, + "p50_ms": 16.752, + "p95_ms": 122.887, + "p99_ms": 391.721, + "max_ms": 738.39, + "ok200": { + "n": 3556, + "p50_ms": 16.848, + "p95_ms": 123.309, + "p99_ms": 396.016, + "max_ms": 738.39 + } + }, + "transport_or_5xx": 192, + "non200_share": 0.0512, + "maintenance_runs": [ + { + "wall_ms": 1792473755128, + "rss_before_mib": 460.8, + "rss_after_mib": 370.3, + "gc_ms": 121.054, + "trim_ms": 9.655, + "run_ms": 130.709, + "collected": 1466, + "in_scored_window": true, + "overlapping_reads": 2, + "overlapping_latency_ms": [ + 7.9, + 44.7 + ] + } + ], + "bursts": [ + { + "burst": 1, + "wall_s": 45.6, + "statuses": { + "429": 1067, + "200": 30, + "TRANSPORT": 3 + }, + "failed_slices": 34, + "req200_ms_p50": 6638, + "rss_mib": 389.6, + "uordblks_mib": null + }, + { + "burst": 2, + "wall_s": 51.4, + "statuses": { + "429": 1117, + "200": 27, + "TRANSPORT": 5 + }, + "failed_slices": 37, + "req200_ms_p50": 6413, + "rss_mib": 403.4, + "uordblks_mib": null + }, + { + "burst": 3, + "wall_s": 52.8, + "statuses": { + "429": 1115, + "200": 25, + "TRANSPORT": 3 + }, + "failed_slices": 39, + "req200_ms_p50": 6940, + "rss_mib": 370.3, + "uordblks_mib": null + }, + { + "burst": 4, + "wall_s": 53.0, + "statuses": { + "429": 1135, + "200": 31, + "TRANSPORT": 1 + }, + "failed_slices": 33, + "req200_ms_p50": 7120, + "rss_mib": 450.3, + "uordblks_mib": null + }, + { + "burst": 5, + "wall_s": 47.1, + "statuses": { + "429": 1052, + "200": 32, + "TRANSPORT": 1 + }, + "failed_slices": 32, + "req200_ms_p50": 7247, + "rss_mib": 400.8, + "uordblks_mib": null + }, + { + "burst": 6, + "wall_s": 49.3, + "statuses": { + "429": 1127, + "200": 30 + }, + "failed_slices": 34, + "req200_ms_p50": 7334, + "rss_mib": 428.2, + "uordblks_mib": null + } + ], + "schedule_lag_ms_p99": 2.0 + }, + "A2": { + "image": "sha256:3e9e4d3add0f35c5d4b4796c785a35b466c326d3328184f396182b5f51367fff", + "scored_window_ms": [ + 1792474099320.129, + 1792474460208.8894 + ], + "pre": { + "n": 606, + "statuses": { + "200": 573, + "503": 33 + }, + "p50_ms": 8.291, + "p95_ms": 9.763, + "p99_ms": 10.613, + "max_ms": 62.245, + "ok200": { + "n": 573, + "p50_ms": 8.331, + "p95_ms": 9.779, + "p99_ms": 11.253, + "max_ms": 62.245 + } + }, + "scored": { + "n": 3609, + "statuses": { + "200": 3421, + "503": 188 + }, + "p50_ms": 17.287, + "p95_ms": 173.093, + "p99_ms": 399.425, + "max_ms": 837.189, + "ok200": { + "n": 3421, + "p50_ms": 17.439, + "p95_ms": 172.016, + "p99_ms": 399.425, + "max_ms": 837.189 + } + }, + "post": { + "n": 761, + "statuses": { + "200": 725, + "503": 36 + }, + "p50_ms": 8.423, + "p95_ms": 9.813, + "p99_ms": 10.803, + "max_ms": 15.44, + "ok200": { + "n": 725, + "p50_ms": 8.446, + "p95_ms": 9.86, + "p99_ms": 10.803, + "max_ms": 15.44 + } + }, + "scored_non_overlap": { + "n": 3609, + "statuses": { + "200": 3421, + "503": 188 + }, + "p50_ms": 17.287, + "p95_ms": 173.093, + "p99_ms": 399.425, + "max_ms": 837.189, + "ok200": { + "n": 3421, + "p50_ms": 17.439, + "p95_ms": 172.016, + "p99_ms": 399.425, + "max_ms": 837.189 + } + }, + "transport_or_5xx": 188, + "non200_share": 0.052091992241618174, + "maintenance_runs": [], + "bursts": [ + { + "burst": 1, + "wall_s": 45.0, + "statuses": { + "429": 1074, + "200": 30, + "TRANSPORT": 1 + }, + "failed_slices": 34, + "req200_ms_p50": 6853, + "rss_mib": 487.1, + "uordblks_mib": null + }, + { + "burst": 2, + "wall_s": 48.6, + "statuses": { + "429": 1109, + "200": 27, + "TRANSPORT": 3 + }, + "failed_slices": 37, + "req200_ms_p50": 5739, + "rss_mib": 465.2, + "uordblks_mib": null + }, + { + "burst": 3, + "wall_s": 50.0, + "statuses": { + "429": 1096, + "200": 31, + "TRANSPORT": 2 + }, + "failed_slices": 33, + "req200_ms_p50": 7544, + "rss_mib": 556.0, + "uordblks_mib": null + }, + { + "burst": 4, + "wall_s": 50.3, + "statuses": { + "429": 1155, + "200": 21, + "TRANSPORT": 5 + }, + "failed_slices": 43, + "req200_ms_p50": 6032, + "rss_mib": 678.0, + "uordblks_mib": null + }, + { + "burst": 5, + "wall_s": 45.9, + "statuses": { + "429": 1029, + "200": 33, + "TRANSPORT": 1 + }, + "failed_slices": 31, + "req200_ms_p50": 7474, + "rss_mib": 639.5, + "uordblks_mib": null + }, + { + "burst": 6, + "wall_s": 44.9, + "statuses": { + "429": 1141, + "200": 25, + "TRANSPORT": 3 + }, + "failed_slices": 39, + "req200_ms_p50": 6785, + "rss_mib": 630.0, + "uordblks_mib": null + } + ], + "schedule_lag_ms_p99": 2.0 + }, + "B2": { + "image": "sha256:753604f8abaa866e2de30c7ccaf36168986bc6991550ee326d53e51b83d1550a", + "scored_window_ms": [ + 1792474609818.901, + 1792474992751.4663 + ], + "pre": { + "n": 606, + "statuses": { + "200": 579, + "503": 27 + }, + "p50_ms": 8.154, + "p95_ms": 9.666, + "p99_ms": 10.579, + "max_ms": 70.462, + "ok200": { + "n": 579, + "p50_ms": 8.193, + "p95_ms": 9.71, + "p99_ms": 10.708, + "max_ms": 70.462 + } + }, + "scored": { + "n": 3830, + "statuses": { + "200": 3646, + "503": 184 + }, + "p50_ms": 16.893, + "p95_ms": 152.42, + "p99_ms": 406.579, + "max_ms": 761.381, + "ok200": { + "n": 3646, + "p50_ms": 17.007, + "p95_ms": 153.997, + "p99_ms": 401.219, + "max_ms": 761.381 + } + }, + "post": { + "n": 765, + "statuses": { + "200": 728, + "503": 37 + }, + "p50_ms": 8.303, + "p95_ms": 9.812, + "p99_ms": 11.3, + "max_ms": 111.305, + "ok200": { + "n": 728, + "p50_ms": 8.333, + "p95_ms": 9.821, + "p99_ms": 11.3, + "max_ms": 111.305 + } + }, + "scored_non_overlap": { + "n": 3830, + "statuses": { + "200": 3646, + "503": 184 + }, + "p50_ms": 16.893, + "p95_ms": 152.42, + "p99_ms": 406.579, + "max_ms": 761.381, + "ok200": { + "n": 3646, + "p50_ms": 17.007, + "p95_ms": 153.997, + "p99_ms": 401.219, + "max_ms": 761.381 + } + }, + "transport_or_5xx": 184, + "non200_share": 0.04804177545691906, + "maintenance_runs": [ + { + "wall_ms": 1792474995340, + "rss_before_mib": 490.5, + "rss_after_mib": 381.2, + "gc_ms": 131.179, + "trim_ms": 15.987, + "run_ms": 147.166, + "collected": 3024, + "in_scored_window": true, + "overlapping_reads": 0, + "overlapping_latency_ms": [] + } + ], + "bursts": [ + { + "burst": 1, + "wall_s": 55.7, + "statuses": { + "429": 1061, + "200": 32, + "TRANSPORT": 2 + }, + "failed_slices": 32, + "req200_ms_p50": 6768, + "rss_mib": 403.5, + "uordblks_mib": null + }, + { + "burst": 2, + "wall_s": 52.5, + "statuses": { + "429": 1104, + "200": 29, + "TRANSPORT": 4 + }, + "failed_slices": 35, + "req200_ms_p50": 7954, + "rss_mib": 407.6, + "uordblks_mib": null + }, + { + "burst": 3, + "wall_s": 49.6, + "statuses": { + "429": 1065, + "200": 32, + "TRANSPORT": 2 + }, + "failed_slices": 32, + "req200_ms_p50": 7023, + "rss_mib": 412.8, + "uordblks_mib": null + }, + { + "burst": 4, + "wall_s": 52.3, + "statuses": { + "429": 1078, + "200": 30, + "TRANSPORT": 1 + }, + "failed_slices": 34, + "req200_ms_p50": 6983, + "rss_mib": 430.2, + "uordblks_mib": null + }, + { + "burst": 5, + "wall_s": 48.1, + "statuses": { + "429": 1124, + "200": 28, + "TRANSPORT": 3 + }, + "failed_slices": 36, + "req200_ms_p50": 7225, + "rss_mib": 436.4, + "uordblks_mib": null + }, + { + "burst": 6, + "wall_s": 48.7, + "statuses": { + "429": 1026, + "200": 33, + "TRANSPORT": 2 + }, + "failed_slices": 31, + "req200_ms_p50": 7050, + "rss_mib": 381.2, + "uordblks_mib": null + } + ], + "schedule_lag_ms_p99": 2.0 + } + }, + "products": { + "bars": [ + { + "consumer": "trading-system.paper.stable", + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BAR", + "gap_policy": "BLOCK", + "instrument_uid": "a953e16e-7138-5562-b5e8-c337a44d0b65", + "interval": "1m", + "max_freshness_ms": 180000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 1000 + }, + "binding_id": "binance-usdm-btcusdt-bar-1m", + "retained_rows": 12131, + "copied_rows": 10000 + }, + { + "consumer": "trading-system.paper.stable", + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BAR", + "gap_policy": "BLOCK", + "instrument_uid": "ee93fabf-68df-5b50-8924-51bf25a5a757", + "interval": "1m", + "max_freshness_ms": 180000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 1000 + }, + "binding_id": "binance-usdm-ethusdt-bar-1m", + "retained_rows": 12155, + "copied_rows": 10000 + }, + { + "consumer": "trading-system.paper.stable", + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BAR", + "gap_policy": "BLOCK", + "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f", + "interval": "1m", + "max_freshness_ms": 180000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 1000 + }, + "binding_id": "okx-swap-btcusdt-bar-1m", + "retained_rows": 12130, + "copied_rows": 10000 + }, + { + "consumer": "trading-system.paper.stable", + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BAR", + "gap_policy": "BLOCK", + "instrument_uid": "e49b54ae-c23d-5351-9e64-47934aac28f8", + "interval": "1m", + "max_freshness_ms": 180000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 1000 + }, + "binding_id": "okx-swap-eth-usdt-swap-bar-1m", + "retained_rows": 12129, + "copied_rows": 10000 + }, + { + "consumer": "trading-system.paper.stable", + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BAR", + "gap_policy": "BLOCK", + "instrument_uid": "e4ce7249-a4e8-5073-beb8-dab908596c34", + "interval": "1m", + "max_freshness_ms": 180000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 1000 + }, + "binding_id": "binance-usdm-solusdt-bar-1m", + "retained_rows": 12133, + "copied_rows": 10000 + }, + { + "consumer": "trading-system.paper.stable", + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BAR", + "gap_policy": "BLOCK", + "instrument_uid": "8aedd349-6999-5874-b0dd-34c6451c0b3a", + "interval": "1m", + "max_freshness_ms": 180000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 1000 + }, + "binding_id": "binance-usdm-dogeusdt-bar-1m", + "retained_rows": 12131, + "copied_rows": 10000 + }, + { + "consumer": "trading-system.paper.stable", + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BAR", + "gap_policy": "BLOCK", + "instrument_uid": "b2d78145-b541-58e2-941b-06c44c65e45f", + "interval": "1m", + "max_freshness_ms": 180000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 1000 + }, + "binding_id": "binance-usdm-bnbusdt-bar-1m", + "retained_rows": 12161, + "copied_rows": 10000 + }, + { + "consumer": "trading-system.paper.stable", + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BAR", + "gap_policy": "BLOCK", + "instrument_uid": "a6884fb3-1fa0-53e0-9621-d01ba5f9a2de", + "interval": "1m", + "max_freshness_ms": 180000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 1000 + }, + "binding_id": "okx-swap-sol-usdt-swap-bar-1m", + "retained_rows": 12089, + "copied_rows": 10000 + }, + { + "consumer": "trading-system.paper.stable", + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BAR", + "gap_policy": "BLOCK", + "instrument_uid": "6c7c9256-2905-5c75-a149-fa0ac36bbbc7", + "interval": "1m", + "max_freshness_ms": 180000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 1000 + }, + "binding_id": "okx-swap-doge-usdt-swap-bar-1m", + "retained_rows": 12087, + "copied_rows": 10000 + }, + { + "consumer": "trading-system.paper.stable", + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BAR", + "gap_policy": "BLOCK", + "instrument_uid": "f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3", + "interval": "1m", + "max_freshness_ms": 180000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 1000 + }, + "binding_id": "okx-swap-bnb-usdt-swap-bar-1m", + "retained_rows": 12082, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "6c7c9256-2905-5c75-a149-fa0ac36bbbc7", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "1m", + "warmup_limit": 10000, + "max_freshness_ms": 180000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-doge-usdt-swap-bar-1m", + "retained_rows": 12087, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "a6884fb3-1fa0-53e0-9621-d01ba5f9a2de", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "1m", + "warmup_limit": 10000, + "max_freshness_ms": 180000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-sol-usdt-swap-bar-1m", + "retained_rows": 12089, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "e49b54ae-c23d-5351-9e64-47934aac28f8", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "1m", + "warmup_limit": 10000, + "max_freshness_ms": 180000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-eth-usdt-swap-bar-1m", + "retained_rows": 12129, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "1m", + "warmup_limit": 10000, + "max_freshness_ms": 180000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-bnb-usdt-swap-bar-1m", + "retained_rows": 12082, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "1m", + "warmup_limit": 10000, + "max_freshness_ms": 180000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-btcusdt-bar-1m", + "retained_rows": 12130, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "6c7c9256-2905-5c75-a149-fa0ac36bbbc7", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "3m", + "warmup_limit": 10000, + "max_freshness_ms": 540000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-doge-usdt-swap-bar-3m", + "retained_rows": 12102, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "a6884fb3-1fa0-53e0-9621-d01ba5f9a2de", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "3m", + "warmup_limit": 10000, + "max_freshness_ms": 540000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-sol-usdt-swap-bar-3m", + "retained_rows": 12099, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "e49b54ae-c23d-5351-9e64-47934aac28f8", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "3m", + "warmup_limit": 10000, + "max_freshness_ms": 540000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-eth-usdt-swap-bar-3m", + "retained_rows": 12100, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "3m", + "warmup_limit": 10000, + "max_freshness_ms": 540000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-bnb-usdt-swap-bar-3m", + "retained_rows": 12100, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "3m", + "warmup_limit": 10000, + "max_freshness_ms": 540000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-btc-usdt-swap-bar-3m", + "retained_rows": 12100, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "6c7c9256-2905-5c75-a149-fa0ac36bbbc7", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "5m", + "warmup_limit": 10000, + "max_freshness_ms": 900000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-doge-usdt-swap-bar-5m", + "retained_rows": 12098, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "a6884fb3-1fa0-53e0-9621-d01ba5f9a2de", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "5m", + "warmup_limit": 10000, + "max_freshness_ms": 900000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-sol-usdt-swap-bar-5m", + "retained_rows": 12098, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "e49b54ae-c23d-5351-9e64-47934aac28f8", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "5m", + "warmup_limit": 10000, + "max_freshness_ms": 900000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-eth-usdt-swap-bar-5m", + "retained_rows": 12098, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "5m", + "warmup_limit": 10000, + "max_freshness_ms": 900000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-bnb-usdt-swap-bar-5m", + "retained_rows": 12098, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "5m", + "warmup_limit": 10000, + "max_freshness_ms": 900000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-btc-usdt-swap-bar-5m", + "retained_rows": 12098, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "6c7c9256-2905-5c75-a149-fa0ac36bbbc7", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "15m", + "warmup_limit": 10000, + "max_freshness_ms": 2700000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-doge-usdt-swap-bar-15m", + "retained_rows": 12093, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "a6884fb3-1fa0-53e0-9621-d01ba5f9a2de", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "15m", + "warmup_limit": 10000, + "max_freshness_ms": 2700000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-sol-usdt-swap-bar-15m", + "retained_rows": 12093, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "e49b54ae-c23d-5351-9e64-47934aac28f8", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "15m", + "warmup_limit": 10000, + "max_freshness_ms": 2700000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-eth-usdt-swap-bar-15m", + "retained_rows": 12093, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "15m", + "warmup_limit": 10000, + "max_freshness_ms": 2700000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-bnb-usdt-swap-bar-15m", + "retained_rows": 12093, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "15m", + "warmup_limit": 10000, + "max_freshness_ms": 2700000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-btc-usdt-swap-bar-15m", + "retained_rows": 12093, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "6c7c9256-2905-5c75-a149-fa0ac36bbbc7", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "30m", + "warmup_limit": 10000, + "max_freshness_ms": 5400000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-doge-usdt-swap-bar-30m", + "retained_rows": 11103, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "a6884fb3-1fa0-53e0-9621-d01ba5f9a2de", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "30m", + "warmup_limit": 10000, + "max_freshness_ms": 5400000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-sol-usdt-swap-bar-30m", + "retained_rows": 11103, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "e49b54ae-c23d-5351-9e64-47934aac28f8", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "30m", + "warmup_limit": 10000, + "max_freshness_ms": 5400000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-eth-usdt-swap-bar-30m", + "retained_rows": 11103, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "30m", + "warmup_limit": 10000, + "max_freshness_ms": 5400000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-bnb-usdt-swap-bar-30m", + "retained_rows": 11103, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "30m", + "warmup_limit": 10000, + "max_freshness_ms": 5400000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-btc-usdt-swap-bar-30m", + "retained_rows": 11103, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "6c7c9256-2905-5c75-a149-fa0ac36bbbc7", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "1h", + "warmup_limit": 10000, + "max_freshness_ms": 10800000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-doge-usdt-swap-bar-1h", + "retained_rows": 10551, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "a6884fb3-1fa0-53e0-9621-d01ba5f9a2de", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "1h", + "warmup_limit": 10000, + "max_freshness_ms": 10800000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-sol-usdt-swap-bar-1h", + "retained_rows": 10551, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "e49b54ae-c23d-5351-9e64-47934aac28f8", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "1h", + "warmup_limit": 10000, + "max_freshness_ms": 10800000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-eth-usdt-swap-bar-1h", + "retained_rows": 10551, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "1h", + "warmup_limit": 10000, + "max_freshness_ms": 10800000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-bnb-usdt-swap-bar-1h", + "retained_rows": 10551, + "copied_rows": 10000 + }, + { + "consumer": "alpha.okx.paper.stable", + "requirement": { + "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f", + "feed": "BAR", + "consumer_grade": "ALPHA", + "source_policy_id": "crypto_primary_v2", + "interval": "1h", + "warmup_limit": 10000, + "max_freshness_ms": 10800000, + "require_full_coverage": true, + "require_final_bars": true, + "stale_policy": "BLOCK", + "gap_policy": "BLOCK", + "recovery": "SNAPSHOT_AND_REPLAY", + "bar_revision_policy": "EMIT_REVISIONS" + }, + "binding_id": "okx-swap-btc-usdt-swap-bar-1h", + "retained_rows": 10551, + "copied_rows": 10000 + } + ], + "latest": [ + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "TRADE", + "gap_policy": "BLOCK", + "instrument_uid": "a953e16e-7138-5562-b5e8-c337a44d0b65", + "max_freshness_ms": 3000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|a953e16e-7138-5562-b5e8-c337a44d0b65|TRADE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "TRADE", + "gap_policy": "BLOCK", + "instrument_uid": "ee93fabf-68df-5b50-8924-51bf25a5a757", + "max_freshness_ms": 3000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|ee93fabf-68df-5b50-8924-51bf25a5a757|TRADE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "QUOTE", + "gap_policy": "BLOCK", + "instrument_uid": "a953e16e-7138-5562-b5e8-c337a44d0b65", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 2000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|a953e16e-7138-5562-b5e8-c337a44d0b65|QUOTE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "QUOTE", + "gap_policy": "BLOCK", + "instrument_uid": "ee93fabf-68df-5b50-8924-51bf25a5a757", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 2000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|ee93fabf-68df-5b50-8924-51bf25a5a757|QUOTE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "TRADE", + "gap_policy": "BLOCK", + "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f", + "max_freshness_ms": 3000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|TRADE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "TRADE", + "gap_policy": "BLOCK", + "instrument_uid": "e49b54ae-c23d-5351-9e64-47934aac28f8", + "max_freshness_ms": 3000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|e49b54ae-c23d-5351-9e64-47934aac28f8|TRADE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "QUOTE", + "gap_policy": "BLOCK", + "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 2000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|QUOTE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "QUOTE", + "gap_policy": "BLOCK", + "instrument_uid": "e49b54ae-c23d-5351-9e64-47934aac28f8", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 2000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|e49b54ae-c23d-5351-9e64-47934aac28f8|QUOTE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "TRADE", + "gap_policy": "BLOCK", + "instrument_uid": "e4ce7249-a4e8-5073-beb8-dab908596c34", + "max_freshness_ms": 3000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|e4ce7249-a4e8-5073-beb8-dab908596c34|TRADE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "QUOTE", + "gap_policy": "BLOCK", + "instrument_uid": "e4ce7249-a4e8-5073-beb8-dab908596c34", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 2000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|e4ce7249-a4e8-5073-beb8-dab908596c34|QUOTE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "TRADE", + "gap_policy": "BLOCK", + "instrument_uid": "8aedd349-6999-5874-b0dd-34c6451c0b3a", + "max_freshness_ms": 3000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|TRADE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "QUOTE", + "gap_policy": "BLOCK", + "instrument_uid": "8aedd349-6999-5874-b0dd-34c6451c0b3a", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 2000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|QUOTE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "TRADE", + "gap_policy": "BLOCK", + "instrument_uid": "b2d78145-b541-58e2-941b-06c44c65e45f", + "max_freshness_ms": 3000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|b2d78145-b541-58e2-941b-06c44c65e45f|TRADE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "QUOTE", + "gap_policy": "BLOCK", + "instrument_uid": "b2d78145-b541-58e2-941b-06c44c65e45f", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 2000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|b2d78145-b541-58e2-941b-06c44c65e45f|QUOTE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "TRADE", + "gap_policy": "BLOCK", + "instrument_uid": "a6884fb3-1fa0-53e0-9621-d01ba5f9a2de", + "max_freshness_ms": 3000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|a6884fb3-1fa0-53e0-9621-d01ba5f9a2de|TRADE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "QUOTE", + "gap_policy": "BLOCK", + "instrument_uid": "a6884fb3-1fa0-53e0-9621-d01ba5f9a2de", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 2000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|a6884fb3-1fa0-53e0-9621-d01ba5f9a2de|QUOTE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "TRADE", + "gap_policy": "BLOCK", + "instrument_uid": "6c7c9256-2905-5c75-a149-fa0ac36bbbc7", + "max_freshness_ms": 3000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|TRADE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "QUOTE", + "gap_policy": "BLOCK", + "instrument_uid": "6c7c9256-2905-5c75-a149-fa0ac36bbbc7", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 2000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|QUOTE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "TRADE", + "gap_policy": "BLOCK", + "instrument_uid": "f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3", + "max_freshness_ms": 3000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3|TRADE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "QUOTE", + "gap_policy": "BLOCK", + "instrument_uid": "f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 2000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3|QUOTE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "MARK_INDEX_PRICE", + "gap_policy": "BLOCK", + "instrument_uid": "a953e16e-7138-5562-b5e8-c337a44d0b65", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "FRESH_SNAPSHOT", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|a953e16e-7138-5562-b5e8-c337a44d0b65|MARK_INDEX_PRICE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BOOK_SNAPSHOT", + "gap_policy": "BLOCK", + "instrument_uid": "a953e16e-7138-5562-b5e8-c337a44d0b65", + "max_freshness_ms": 60000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|a953e16e-7138-5562-b5e8-c337a44d0b65|BOOK_SNAPSHOT|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "BOOK_DELTA", + "gap_policy": "BLOCK", + "instrument_uid": "a953e16e-7138-5562-b5e8-c337a44d0b65", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|a953e16e-7138-5562-b5e8-c337a44d0b65|BOOK_DELTA|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "MARK_INDEX_PRICE", + "gap_policy": "BLOCK", + "instrument_uid": "ee93fabf-68df-5b50-8924-51bf25a5a757", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "FRESH_SNAPSHOT", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|ee93fabf-68df-5b50-8924-51bf25a5a757|MARK_INDEX_PRICE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BOOK_SNAPSHOT", + "gap_policy": "BLOCK", + "instrument_uid": "ee93fabf-68df-5b50-8924-51bf25a5a757", + "max_freshness_ms": 60000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|ee93fabf-68df-5b50-8924-51bf25a5a757|BOOK_SNAPSHOT|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "BOOK_DELTA", + "gap_policy": "BLOCK", + "instrument_uid": "ee93fabf-68df-5b50-8924-51bf25a5a757", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|ee93fabf-68df-5b50-8924-51bf25a5a757|BOOK_DELTA|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "MARK_INDEX_PRICE", + "gap_policy": "BLOCK", + "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "FRESH_SNAPSHOT", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|MARK_INDEX_PRICE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BOOK_SNAPSHOT", + "gap_policy": "BLOCK", + "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f", + "max_freshness_ms": 60000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|BOOK_SNAPSHOT|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "BOOK_DELTA", + "gap_policy": "BLOCK", + "instrument_uid": "fb26214c-7b9b-5961-95b2-55154755af0f", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|fb26214c-7b9b-5961-95b2-55154755af0f|BOOK_DELTA|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "MARK_INDEX_PRICE", + "gap_policy": "BLOCK", + "instrument_uid": "e49b54ae-c23d-5351-9e64-47934aac28f8", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "FRESH_SNAPSHOT", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|e49b54ae-c23d-5351-9e64-47934aac28f8|MARK_INDEX_PRICE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BOOK_SNAPSHOT", + "gap_policy": "BLOCK", + "instrument_uid": "e49b54ae-c23d-5351-9e64-47934aac28f8", + "max_freshness_ms": 60000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|e49b54ae-c23d-5351-9e64-47934aac28f8|BOOK_SNAPSHOT|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "BOOK_DELTA", + "gap_policy": "BLOCK", + "instrument_uid": "e49b54ae-c23d-5351-9e64-47934aac28f8", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|e49b54ae-c23d-5351-9e64-47934aac28f8|BOOK_DELTA|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "MARK_INDEX_PRICE", + "gap_policy": "BLOCK", + "instrument_uid": "e4ce7249-a4e8-5073-beb8-dab908596c34", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "FRESH_SNAPSHOT", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|e4ce7249-a4e8-5073-beb8-dab908596c34|MARK_INDEX_PRICE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BOOK_SNAPSHOT", + "gap_policy": "BLOCK", + "instrument_uid": "e4ce7249-a4e8-5073-beb8-dab908596c34", + "max_freshness_ms": 60000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|e4ce7249-a4e8-5073-beb8-dab908596c34|BOOK_SNAPSHOT|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "BOOK_DELTA", + "gap_policy": "BLOCK", + "instrument_uid": "e4ce7249-a4e8-5073-beb8-dab908596c34", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|e4ce7249-a4e8-5073-beb8-dab908596c34|BOOK_DELTA|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "MARK_INDEX_PRICE", + "gap_policy": "BLOCK", + "instrument_uid": "8aedd349-6999-5874-b0dd-34c6451c0b3a", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "FRESH_SNAPSHOT", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|MARK_INDEX_PRICE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BOOK_SNAPSHOT", + "gap_policy": "BLOCK", + "instrument_uid": "8aedd349-6999-5874-b0dd-34c6451c0b3a", + "max_freshness_ms": 60000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BOOK_SNAPSHOT|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "BOOK_DELTA", + "gap_policy": "BLOCK", + "instrument_uid": "8aedd349-6999-5874-b0dd-34c6451c0b3a", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|8aedd349-6999-5874-b0dd-34c6451c0b3a|BOOK_DELTA|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "MARK_INDEX_PRICE", + "gap_policy": "BLOCK", + "instrument_uid": "b2d78145-b541-58e2-941b-06c44c65e45f", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "FRESH_SNAPSHOT", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|b2d78145-b541-58e2-941b-06c44c65e45f|MARK_INDEX_PRICE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BOOK_SNAPSHOT", + "gap_policy": "BLOCK", + "instrument_uid": "b2d78145-b541-58e2-941b-06c44c65e45f", + "max_freshness_ms": 60000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|b2d78145-b541-58e2-941b-06c44c65e45f|BOOK_SNAPSHOT|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "BOOK_DELTA", + "gap_policy": "BLOCK", + "instrument_uid": "b2d78145-b541-58e2-941b-06c44c65e45f", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|BINANCE|USDM|b2d78145-b541-58e2-941b-06c44c65e45f|BOOK_DELTA|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "MARK_INDEX_PRICE", + "gap_policy": "BLOCK", + "instrument_uid": "a6884fb3-1fa0-53e0-9621-d01ba5f9a2de", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "FRESH_SNAPSHOT", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|a6884fb3-1fa0-53e0-9621-d01ba5f9a2de|MARK_INDEX_PRICE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BOOK_SNAPSHOT", + "gap_policy": "BLOCK", + "instrument_uid": "a6884fb3-1fa0-53e0-9621-d01ba5f9a2de", + "max_freshness_ms": 60000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|a6884fb3-1fa0-53e0-9621-d01ba5f9a2de|BOOK_SNAPSHOT|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "BOOK_DELTA", + "gap_policy": "BLOCK", + "instrument_uid": "a6884fb3-1fa0-53e0-9621-d01ba5f9a2de", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|a6884fb3-1fa0-53e0-9621-d01ba5f9a2de|BOOK_DELTA|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "MARK_INDEX_PRICE", + "gap_policy": "BLOCK", + "instrument_uid": "6c7c9256-2905-5c75-a149-fa0ac36bbbc7", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "FRESH_SNAPSHOT", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|MARK_INDEX_PRICE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BOOK_SNAPSHOT", + "gap_policy": "BLOCK", + "instrument_uid": "6c7c9256-2905-5c75-a149-fa0ac36bbbc7", + "max_freshness_ms": 60000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BOOK_SNAPSHOT|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "BOOK_DELTA", + "gap_policy": "BLOCK", + "instrument_uid": "6c7c9256-2905-5c75-a149-fa0ac36bbbc7", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|6c7c9256-2905-5c75-a149-fa0ac36bbbc7|BOOK_DELTA|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "MARK_INDEX_PRICE", + "gap_policy": "BLOCK", + "instrument_uid": "f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "FRESH_SNAPSHOT", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3|MARK_INDEX_PRICE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BOOK_SNAPSHOT", + "gap_policy": "BLOCK", + "instrument_uid": "f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3", + "max_freshness_ms": 60000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3|BOOK_SNAPSHOT|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "BOOK_DELTA", + "gap_policy": "BLOCK", + "instrument_uid": "f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3|BOOK_DELTA|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "TRADE", + "gap_policy": "BLOCK", + "instrument_uid": "d0ac3d4c-2374-5690-8af5-b970448f91d3", + "max_freshness_ms": 30000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "vn_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|HNX|VN_DERIVATIVES|d0ac3d4c-2374-5690-8af5-b970448f91d3|TRADE|-", + "copied": false + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "BOOK_DELTA", + "gap_policy": "BLOCK", + "instrument_uid": "8482b54b-6d9d-5aad-abe8-e22447d183a1", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|8482b54b-6d9d-5aad-abe8-e22447d183a1|BOOK_DELTA|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "feed": "BOOK_SNAPSHOT", + "gap_policy": "BLOCK", + "instrument_uid": "8482b54b-6d9d-5aad-abe8-e22447d183a1", + "max_freshness_ms": 60000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|8482b54b-6d9d-5aad-abe8-e22447d183a1|BOOK_SNAPSHOT|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "MARK_INDEX_PRICE", + "gap_policy": "BLOCK", + "instrument_uid": "8482b54b-6d9d-5aad-abe8-e22447d183a1", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 45000, + "recovery": "FRESH_SNAPSHOT", + "require_final_bars": false, + "require_full_coverage": true, + "source_policy_id": "crypto_liquid_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|8482b54b-6d9d-5aad-abe8-e22447d183a1|MARK_INDEX_PRICE|-", + "copied": true + }, + { + "requirement": { + "bar_revision_policy": "LATEST", + "consumer_grade": "EXECUTION", + "event_recency_policy": "OBSERVE", + "feed": "QUOTE", + "gap_policy": "BLOCK", + "instrument_uid": "8482b54b-6d9d-5aad-abe8-e22447d183a1", + "max_freshness_ms": 2000, + "max_session_liveness_ms": 2000, + "recovery": "SNAPSHOT_AND_REPLAY", + "require_final_bars": true, + "require_full_coverage": true, + "source_policy_id": "crypto_primary_v2", + "stale_policy": "BLOCK", + "warmup_limit": 0 + }, + "lpk": "lpk1|paper|OKX|SWAP|8482b54b-6d9d-5aad-abe8-e22447d183a1|QUOTE|-", + "copied": true + } + ], + "copied_utc": "2026-10-20T05:45:02Z" + }, + "analyzed_utc": "2026-10-20T05:51:07Z" +} From 4e87da2ba32ec0dad8722a7e97adfe9665eeebd4 Mon Sep 17 00:00:00 2001 From: BobbyAxerol Date: Tue, 20 Oct 2026 06:10:25 +0000 Subject: [PATCH 8/9] v2.2.5 Query A/B harness: P1b alpha byte compare (DR02/DR03 alpha read shapes, alpha-binance r16 + alpha-okx r15 BAR 1m) Same BC rule; --alpha re-runs only the compare phase in the session dir; analyze-alpha writes byte-compare-alpha.json. --- scripts/v225_query_hot_read_ab.py | 241 ++++++++++++++++++++++++++++-- 1 file changed, 226 insertions(+), 15 deletions(-) diff --git a/scripts/v225_query_hot_read_ab.py b/scripts/v225_query_hot_read_ab.py index d2d49635..2552b440 100644 --- a/scripts/v225_query_hot_read_ab.py +++ b/scripts/v225_query_hot_read_ab.py @@ -60,6 +60,9 @@ TS_JWT = STATE / "655d2106d01f/bundle/identities-rotate-20260822T144323Z/trading-system-jwt" OKX_TLS = STATE / "r135-local-batch-fair-e905747-20260920T135150Z/identities/alpha-okx" OKX_JWT = STATE / "r135-local-batch-fair-e905747-20260920T135150Z/identities/alpha-okx-jwt" +# alpha-binance: new-generation leaf (same CN/SAN as r135, issued for the TS G13 v2.2.5 run), registered r135 JWT key +BINANCE_TLS = Path.home() / ".local/state/trading-system/p184-20261005/runtime/phase-e/g13v225/identities/alpha-binance" +BINANCE_JWT = STATE / "r135-local-batch-fair-e905747-20260920T135150Z/identities/alpha-binance-jwt" MOUNTS = harness.MOUNTS TS = "trading-system.paper.stable" OKX = "alpha.okx.paper.stable" @@ -110,7 +113,12 @@ bars += sorted(({"consumer": "alpha.okx.paper.stable", "requirement": r} for r in okx if r["feed"] == "BAR" and r.get("interval") in order), key=lambda e: (order[e["requirement"]["interval"]], e["requirement"]["instrument_uid"])) -json.dump({"ts_r11": ts, "bars": bars}, sys.stdout) +binance = yaml.safe_load(open(realm + "alpha.binance.paper.stable-r16.yaml"))["spec"]["requirements"] +alpha_1m = [{"consumer": "alpha.binance.paper.stable", "requirement": r} for r in binance + if r["feed"] == "BAR" and r.get("interval") == "1m"] +alpha_1m += [{"consumer": "alpha.okx.paper.stable", "requirement": r} for r in okx + if r["feed"] == "BAR" and r.get("interval") == "1m"] +json.dump({"ts_r11": ts, "bars": bars, "alpha_1m": alpha_1m}, sys.stdout) ''' SYNC = r''' @@ -247,7 +255,9 @@ def copy_latest(lpk): ROLES = ("historical_reader", "market_data_reader", "stream_consumer") IDS = {"trading-system.paper.stable": ("trading-system", "stable-trading-system-rs256-v1", "spiffe://qdl/paper/trading-system-stable", 11), - "alpha.okx.paper.stable": ("alpha-okx", "stable-alpha-okx-rs256-v1", "spiffe://qdl/paper/alpha-okx-stable", 15)} + "alpha.okx.paper.stable": ("alpha-okx", "stable-alpha-okx-rs256-v1", "spiffe://qdl/paper/alpha-okx-stable", 15), + "alpha.binance.paper.stable": ("alpha-binance", "stable-alpha-binance-rs256-v1", + "spiffe://qdl/paper/alpha-binance-stable", 16)} ENUMS = {"feed": Feed, "consumer_grade": Grade, "stale_policy": StalePolicy, "gap_policy": GapPolicy, "recovery": RecoveryPolicy, "bar_revision_policy": BarRevisionPolicy, "event_recency_policy": StalePolicy} @@ -409,6 +419,90 @@ async def main(): asyncio.run(main()) ''' +CMP_ALPHA_DRIVER = COMMON + r''' +"""DR02/DR03 alpha read shapes (TS scripts/p184_dr_alpha_reads.py probe, at the Data Layer request level): +A (old), B (new) and A' (second request to A) per shape, sync paused; instrument pages follow each side's cursor.""" +cfg = json.load(open("/work/cmp-alpha.json")) +exec(open("/work/cmp_helpers.py").read()) + +async def request(t, consumer, shape, cursor=None): + if shape["kind"] == "warmup": + limit = shape["limit"] + req = requirement(shape["item"], min(limit, 10000)) + params = req.query_params() + if limit > 10000: + params["limit"] = limit # the probe's over-bound read; the SDK type would refuse it client-side + headers = await t._headers(req, consumer) + return await t._client.get(f"/v2/market-data/{req.instrument_uid}/warmup", params=params, headers=headers) + if shape["kind"] == "batch": + reqs = [requirement(item, shape["limit"]) for item in shape["items"]] + headers = await t._identity_headers(reqs[0].consumer_grade, consumer) + return await t._client.post("/v2/market-data/warmup:batch", headers=headers, json={ + "consumer_id": consumer, "require_all": False, "requirements": [r.to_mapping() for r in reqs]}) + headers = await t._identity_headers(Grade.ALPHA, consumer) + params = {"limit": 500, **({"cursor": cursor} if cursor else {})} + return await t._client.get("/v2/instruments", params=params, headers=headers) + +async def fetch(t, consumer, shape, cursor=None): + t0 = time.perf_counter() + response = await request(t, consumer, shape, cursor) + body = response.content + return {"status": response.status_code, "ms": round((time.perf_counter() - t0) * 1e3, 1), + "content_length": response.headers.get("content-length"), + "transfer_encoding": response.headers.get("transfer-encoding"), + "content_type": response.headers.get("content-type"), "body": body} + +async def main(): + consumers = sorted({s["consumer"] for s in cfg["shapes"]}) + ta = {c: transport(c, cfg["urls"]["A"], timeout=60.0) for c in consumers} + tb = {c: transport(c, cfg["urls"]["B"], timeout=60.0) for c in consumers} + await wait_live(ta[consumers[0]]) + await wait_live(tb[consumers[0]]) + await asyncio.sleep(5) + out = [] + index = 0 + for pass_no in range(1, cfg["passes"] + 1): + index = 0 # stable per shape/page across passes + for shape in cfg["shapes"]: + c = shape["consumer"] + cursors = {"A": None, "B": None, "A2": None} + page = 0 + while True: + page += 1 + label = shape["label"] + (f":p{page}" if shape["kind"] == "instruments" else "") + record = {"pass": pass_no, "index": index, "label": label, "consumer": c, + "instrument_uid": shape.get("item", {}).get("instrument_uid", label), + "feed": label, "attempts": []} + parsed = {} + for attempt in range(1, 4): + await pause() + try: + a, b, a2 = await asyncio.gather(fetch(ta[c], c, shape, cursors["A"]), + fetch(tb[c], c, shape, cursors["B"]), + fetch(ta[c], c, shape, cursors["A2"])) + finally: + resume() + entry, parsed = triple_entry(a, b, a2, attempt) + record["attempts"].append(entry) + if entry["valid"]: + break + await asyncio.sleep(1.0) + out.append(record) + index += 1 + print(json.dumps({"pass": pass_no, "label": label, "status": [entry["A_status"], entry["B_status"]], + "valid": entry["valid"]}), flush=True) + await asyncio.sleep(0.5) + nxt = {k: (v or {}).get("next_cursor") if isinstance(v, dict) else None for k, v in parsed.items()} + if shape["kind"] != "instruments" or not nxt.get("A") or page >= 100: + break + cursors = {"A": nxt["A"], "B": nxt["B"], "A2": nxt["A2"]} + json.dump(out, open("/out/byte-compare-alpha-raw.json", "w"), indent=1) + for t in list(ta.values()) + list(tb.values()): + await t.close() + +asyncio.run(main()) +''' + BURST_DRIVER = COMMON + r''' cfg = json.load(open("/work/burst.json")) seq = 0 @@ -554,6 +648,93 @@ async def main(): ''' +CMP_HELPERS = r''' +CONSUMER = None + +def atomic(path, text): + with open(path + ".tmp", "w") as handle: + handle.write(text) + os.replace(path + ".tmp", path) + +async def pause(): + if os.path.exists("/work/paused"): + os.unlink("/work/paused") + atomic("/work/pause", "1") + deadline = time.monotonic() + 10 + while not os.path.exists("/work/paused"): + if time.monotonic() > deadline: + raise RuntimeError("sync did not acknowledge the pause") + await asyncio.sleep(0.02) + +def resume(): + for path in ("/work/pause", "/work/paused"): + if os.path.exists(path): + os.unlink(path) + +def leaves(value, path=()): + if isinstance(value, dict): + out = {("__keys__",) + path: sorted(value)} + for k, v in value.items(): + out.update(leaves(v, path + (k,))) + return out + if isinstance(value, list): + out = {("__len__",) + path: len(value)} + for i, v in enumerate(value): + out.update(leaves(v, path + (i,))) + return out + return {path: value} + +def diff(a, b): + la, lb = leaves(a), leaves(b) + return sorted({repr(k) for k in set(la) | set(lb) if la.get(k, "") != lb.get(k, "")}) + +def triple_entry(a, b, a2, attempt): + parsed = {} + for name, r in (("A", a), ("B", b), ("A2", a2)): + try: + parsed[name] = json.loads(r["body"]) + except ValueError: + parsed[name] = None + digest = hashlib.sha256(r["body"]).hexdigest() + path = f"/out/bodies/{digest}.json" + if not os.path.exists(path): + with open(path, "wb") as handle: + handle.write(r["body"]) + r["sha256"], r["length"] = digest, len(r["body"]) + v_paths = diff(parsed["A"], parsed["A2"]) if None not in (parsed["A"], parsed["A2"]) else [""] + structural = [p for p in v_paths if "__len__" in p or "__keys__" in p or p == ""] + ab_paths = diff(parsed["A"], parsed["B"]) if None not in (parsed["A"], parsed["B"]) else [""] + entry = {"attempt": attempt, + **{f"{n}_{k}": r[k] for n, r in (("A", a), ("B", b), ("A2", a2)) + for k in ("status", "ms", "content_length", "transfer_encoding", "content_type", "sha256", "length")}, + "volatile_paths": v_paths, "a_vs_b_paths": ab_paths, "valid": not structural, + "normalized_equal": None, "normalized_sha256": None, + "rows": len(parsed["A"].get("data") or []) if isinstance(parsed["A"], dict) and isinstance(parsed["A"].get("data"), list) else None} + return entry, parsed +''' + + +def alpha_shapes(plan: dict) -> list: + """The DR02/DR03 probe's Data Layer requests per alpha consumer (TS scripts/p184_dr_alpha_reads.py:99-138).""" + shapes = [] + for consumer in ("alpha.binance.paper.stable", "alpha.okx.paper.stable"): + items = [e["requirement"] for e in plan["alpha_1m"] if e["consumer"] == consumer] + short = consumer.split(".")[1] + first = items[0] + shapes.append({"consumer": consumer, "kind": "instruments", "label": f"{short}:instruments"}) + for item in items: + shapes.append({"consumer": consumer, "kind": "warmup", "item": item, "limit": 5, + "label": f"{short}:warmup5:{item['instrument_uid']}"}) + for limit in (700, 10000, 10001): + shapes.append({"consumer": consumer, "kind": "warmup", "item": first, "limit": limit, + "label": f"{short}:warmup{limit}:{first['instrument_uid']}"}) + shapes.append({"consumer": consumer, "kind": "batch", "items": items, "limit": 200, + "label": f"{short}:batch-universe200"}) + shapes.append({"consumer": consumer, "kind": "batch", "items": [first], "limit": 10, + "label": f"{short}:batch-mixed10 (the unknown symbol fails at resolve, client side)"}) + return shapes + + def sh(*args, check=True, timeout=180): result = subprocess.run(list(args), capture_output=True, text=True, timeout=timeout) if check and result.returncode != 0: @@ -602,18 +783,20 @@ def writable_dir(path: Path) -> Path: return path -def driver_identities(okx: bool) -> list[str]: +def driver_identities(okx: bool, binance: bool = False) -> list[str]: items = {"trading-system": TS_TLS, "trading-system-jwt": TS_JWT} if okx: items.update({"alpha-okx": OKX_TLS, "alpha-okx-jwt": OKX_JWT}) + if binance: + items.update({"alpha-binance": BINANCE_TLS, "alpha-binance-jwt": BINANCE_JWT}) return ro({f"/identities/{k}": v for k, v in items.items()}) -def driver_cmd(name: str, work: Path, code: str, *, okx=False, cpus="1.0", extra=()) -> list[str]: +def driver_cmd(name: str, work: Path, code: str, *, okx=False, binance=False, cpus="1.0", extra=()) -> list[str]: return ["docker", "run", "--rm", "--name", PREFIX + name, "--label", LABEL, "--network", NETWORK, "--user", "0:0", "--cap-drop", "ALL", "--cap-add", "DAC_READ_SEARCH", "--read-only", "--security-opt", "no-new-privileges:true", "--cpus", cpus, "--memory", "1g", - "-e", "PYTHONPATH=/app", *driver_identities(okx), "--mount", f"type=bind,src={work},dst=/work", + "-e", "PYTHONPATH=/app", *driver_identities(okx, binance), "--mount", f"type=bind,src={work},dst=/work", *extra, OLD_IMAGE, "python", "-c", code] @@ -771,7 +954,8 @@ def run(args) -> int: else: require_lock(args.lock_owner) output = args.output.resolve() - compare_only = bool(getattr(args, "compare_only", False)) + alpha = bool(getattr(args, "alpha", False)) + compare_only = bool(getattr(args, "compare_only", False)) or alpha output.mkdir(mode=0o700, parents=True, exist_ok=compare_only) stop_sampler = threading.Event() threading.Thread(target=sampler, args=(output / "foreign.jsonl", stop_sampler), daemon=True).start() @@ -783,13 +967,15 @@ def run(args) -> int: # re-run of the BC phase in the session dir of the arms (the first BC output was lost: /out not writable) if not (output / "prereg.json").exists(): raise SystemExit("compare-only needs the session's prereg.json") - (output / "compare-rerun.json").write_text(json.dumps({**prereg, "rerun_reason": args.compare_only_reason}, - indent=1) + "\n") + (output / ("compare-alpha.json" if alpha else "compare-rerun.json")).write_text(json.dumps( + {**prereg, "rerun_reason": args.compare_only_reason, + **({"alpha_scope": "P1b (coordinator 2026-10-20): DR02/DR03 alpha read shapes, alpha-binance r16 + alpha-okx r15 BAR 1m, same BC rule"} if alpha else {})}, + indent=1) + "\n") else: (output / "prereg.json").write_text(json.dumps(prereg, indent=1) + "\n") print(json.dumps({"prereg_sha256": hashlib.sha256((output / "prereg.json").read_bytes()).hexdigest()}), flush=True) env, mounts, cmd = prod_spec() - work_root = writable_dir(output / ("work-cmp-rerun" if compare_only else "work")) + work_root = writable_dir(output / ("work-cmp-alpha" if alpha else "work-cmp-rerun" if compare_only else "work")) writable_dir(output / "cmp-out") bodies = writable_dir(output / "cmp-out" / "bodies") sync = None @@ -802,6 +988,8 @@ def run(args) -> int: plan = json.loads(sh("docker", "run", "--rm", "--network", "none", "--user", "10001:10001", "--read-only", "--cpus", "0.5", *ro({"/consumer-realms": mounts["/consumer-realms"]}), OLD_IMAGE, "python", "-c", PLAN)) + if alpha: + plan = {**plan, "bars": plan["alpha_1m"], "ts_r11": []} (work_root / "plan.json").write_text(json.dumps(plan)) sh("docker", "create", "--rm", "--name", PREFIX + "sync", "--label", LABEL, "--network", NETWORK, "--user", "10001:10001", "--read-only", "--cpus", "0.5", "--memory", "512m", "-e", "PYTHONPATH=/app", @@ -814,18 +1002,24 @@ def run(args) -> int: wait_file(work_root / "sync-ready", 900) products = json.loads((work_root / "products.json").read_text()) latest = json.loads((work_root / "latest.json").read_text()) - (output / "products.json").write_text(json.dumps({"bars": products, "latest": latest, "copied_utc": utc()}, - indent=1) + "\n") + (output / ("products-alpha.json" if alpha else "products.json")).write_text( + json.dumps({"bars": products, "latest": latest, "copied_utc": utc()}, indent=1) + "\n") # 1. byte compare: A and B side by side on the same cache, sync paused per triple - cmp_dir = output / ("cmp-rerun" if compare_only else "cmp") + cmp_dir = output / ("cmp-alpha" if alpha else "cmp-rerun" if compare_only else "cmp") cmp_dir.mkdir(mode=0o700) qa = start_query("q-cmp-a", "query_v2_1", OLD_IMAGE, cmp_dir, env, mounts, cmd) qb = start_query("q-cmp-b", "query_v2_2", NEW_IMAGE, cmp_dir, env, mounts, cmd) (work_root / "cmp.json").write_text(json.dumps({"urls": {"A": "https://query_v2_1:8200", "B": "https://query_v2_2:8200"}, "requirements": plan["ts_r11"], "passes": 2})) + if alpha: + (work_root / "cmp-alpha.json").write_text(json.dumps({"urls": {"A": "https://query_v2_1:8200", + "B": "https://query_v2_2:8200"}, + "shapes": alpha_shapes(plan), "passes": 2})) + (work_root / "cmp_helpers.py").write_text(CMP_HELPERS) try: - cmp_run = subprocess.run(driver_cmd("cmp", work_root, CMP_DRIVER, extra=( + cmp_run = subprocess.run(driver_cmd("cmp", work_root, CMP_ALPHA_DRIVER if alpha else CMP_DRIVER, + okx=alpha, binance=alpha, extra=( "--mount", f"type=bind,src={bodies.parent},dst=/out")), capture_output=True, text=True, timeout=1800) (cmp_dir / "driver.out").write_text(cmp_run.stdout[-200000:] + "\n--stderr--\n" + cmp_run.stderr[-20000:]) finally: @@ -960,9 +1154,9 @@ def raw_mask(raw: bytes, paths: set) -> bytes: return b"".join(out) -def byte_compare(output: Path) -> dict: +def byte_compare(output: Path, raw_name: str = "byte-compare-raw.json") -> dict: import ast - raw = json.loads((output / "cmp-out/byte-compare-raw.json").read_text()) + raw = json.loads((output / "cmp-out" / raw_name).read_text()) bodies = output / "cmp-out/bodies" for record in raw: final = record["attempts"][-1] @@ -1083,6 +1277,19 @@ def share(labels): return 0 +def analyze_alpha(args) -> int: + output = args.output.resolve() + bc = byte_compare(output, "byte-compare-alpha-raw.json") + prereg_sha = hashlib.sha256((output / "prereg.json").read_bytes()).hexdigest() + (output / "byte-compare-alpha.json").write_text(json.dumps({ + "schema": "qdl.v225.query-warmup-byte-compare.v1", "scope": "P1b: alpha DR02/DR03 read shapes (TS scripts/p184_dr_alpha_reads.py:99-138) at the Data Layer request level; alpha-binance r16 + alpha-okx r15 BAR 1m", + "old_image": OLD_IMAGE, "new_image": NEW_IMAGE, "prereg_rule": PREREG["rules"]["BC"], "prereg_sha256": prereg_sha, + **bc}, indent=1) + "\n") + print(json.dumps({k: bc[k] for k in ("requirements", "triples", "status_counts_A", "volatile_paths_seen", "verdict")} + | {"problems": bc["problems"][:8]}, indent=1)) + return 0 + + def cleanup(_args) -> int: names = [n for n in sh("docker", "ps", "-a", "--filter", f"label={LABEL}", "--format", "{{.Names}}", check=False).splitlines() if n.startswith(PREFIX)] @@ -1106,10 +1313,14 @@ def main() -> int: help="owner-instructed run beside another agent's correctness-only lock (never touches the lock)") p.add_argument("--compare-only", action="store_true", help="re-run only the BC phase inside an existing session dir") p.add_argument("--compare-only-reason", default="") + p.add_argument("--alpha", action="store_true", help="P1b: BC of the DR02/DR03 alpha read shapes (implies compare-only)") p.set_defaults(func=run) p = sub.add_parser("analyze") p.add_argument("--output", type=Path, required=True) p.set_defaults(func=analyze) + p = sub.add_parser("analyze-alpha") + p.add_argument("--output", type=Path, required=True) + p.set_defaults(func=analyze_alpha) p = sub.add_parser("cleanup") p.set_defaults(func=cleanup) args = parser.parse_args() From d093f979f5f23dc9e9542202b43956c4e5db5660 Mon Sep 17 00:00:00 2001 From: BobbyAxerol Date: Tue, 20 Oct 2026 06:14:56 +0000 Subject: [PATCH 9/9] v2.2.5: P1b alpha DR02/DR03 warmup byte compare PASS; certificate evidence updated 24 alpha read shapes (alpha-binance r16 + alpha-okx r15 BAR 1m) x 2 passes on old 3e9e4d3a vs new 753604f8: statuses equal (44 x 200, 4 x 400), bodies byte-identical outside per-request paths (byte-compare-alpha.json c884e495). Certificate, endpoint report, ledger and plan. --- CERTIFICATION_LEDGER.md | 3 + DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md | 10 + .../evidence/releases/v2.2.5/CERTIFICATE.md | 17 +- .../evidence/releases/v2.2.5/certificate.json | 20 +- .../releases/v2.2.5/endpoint-report.json | 21 + .../v2.2.5/query-ab-20261020/SHA256SUMS | 6 +- .../query-ab-20261020/byte-compare-alpha.json | 1616 +++++++++++++++++ .../query-ab-20261020/compare-alpha.json | 46 + .../v2.2.5/query-ab-20261020/foreign.jsonl | 7 + 9 files changed, 1736 insertions(+), 10 deletions(-) create mode 100644 upgrade/evidence/releases/v2.2.5/query-ab-20261020/byte-compare-alpha.json create mode 100644 upgrade/evidence/releases/v2.2.5/query-ab-20261020/compare-alpha.json diff --git a/CERTIFICATION_LEDGER.md b/CERTIFICATION_LEDGER.md index 91c9d2d1..0caf31b7 100644 --- a/CERTIFICATION_LEDGER.md +++ b/CERTIFICATION_LEDGER.md @@ -2431,3 +2431,6 @@ Pinned at: nothing. - Certificate re-issued: G5 PASS by complete delta proof; P1 superseded (never used); `gates_without_a5` keeps G11 FAIL as in v2.2.4. Re-run only if either Query image, the warmup/snapshot code path or the TS r11 manifest changes. +- P1b (coordinator, same session 06:10-06:13Z): alpha DR02/DR03 read shapes (alpha-binance r16 + alpha-okx r15 BAR 1m: + instrument pages, warmup 5/700/10,000, 10,001 typed refusal, universe batch 200, mixed batch 10), 24 shapes x 2 + passes: PASS, byte-identical outside per-request paths (`byte-compare-alpha.json` `c884e495...`). diff --git a/DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md b/DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md index fd08aef1..b959217f 100644 --- a/DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md +++ b/DATA_LAYER_UNIFIED_IMPLEMENTATION_PLAN.md @@ -77125,3 +77125,13 @@ locally; release image NOT rebuilt (the coordinator rebuilds rust together with docker logs. - Status: v2.2.5 certificate PASS, not tagged. Next: PR #48 CI and merge (coordinator), then the dev -> main release PR. +- P1b (coordinator, owner-approved DR delta proof): the BC rule was extended to the TS DR02/DR03 alpha read shapes + (`--alpha`, harness `4e87da2b`). The shapes: + - alpha-binance r16 with its new-generation leaf and the registered r135 JWT; + - alpha-okx r15 with its r135 leaf and JWT; + - per consumer: instrument pages, warmup 5 x 5 symbols, 700, 10,000, a 10,001 refusal, a universe batch of 200 and + a mixed batch of 10. + + Same session, 06:10-06:13Z, 24 shapes x 2 passes: **PASS**. Statuses: 44 x 200 and 4 x 400 typed refusals, equal on + both images. Receipt `byte-compare-alpha.json` `c884e495...`, copied to the release folder. 0 `qdl-hr-*` containers + and networks left. diff --git a/upgrade/evidence/releases/v2.2.5/CERTIFICATE.md b/upgrade/evidence/releases/v2.2.5/CERTIFICATE.md index d18d3106..144dde6a 100644 --- a/upgrade/evidence/releases/v2.2.5/CERTIFICATE.md +++ b/upgrade/evidence/releases/v2.2.5/CERTIFICATE.md @@ -76,7 +76,7 @@ digests. | IDR-127 semantic parity | [semantic-parity.json](semantic-parity.json) | `0d8e3a3bbc0096691b10cfc0a172779968f5dc68bdc7f301cc00492b536b4861` | | Inherited certificate / endpoint report / scorecard | `../v2.2.4/certificate.json`, `endpoint-report.json`, `scorecard.json` | `42412548...`, `013b66e6...`, `2dc2f8d1...` | | Inherited G12/G13 | `../v2.2.4/g12-g13-inheritance.json` | `95088c9c...` | -| Query A/B (D3 (b) hot reads + DR warmup byte compare), pre-registered | [query-ab-20261020/](query-ab-20261020/): `prereg.json`, `receipt.json`, `byte-compare.json`, `foreign.jsonl`, `compare-rerun.json`; raw files (hot reads, Query logs, bodies) under `~/.local/state/qdl-v2/releases/v2.2.5/query-ab-20261020c/` | `SHA256SUMS` in that folder; receipt `d3899b22...`, byte compare `41ebcc3c575e3fb1cb37ee069cd5eff156bb0ed7ef0dd4b0b5becc51e22ae7e4` | +| Query A/B (D3 (b) hot reads + DR warmup byte compare), pre-registered | [query-ab-20261020/](query-ab-20261020/): `prereg.json`, `receipt.json`, `byte-compare.json`, `foreign.jsonl`, `compare-rerun.json`; raw files (hot reads, Query logs, bodies) under `~/.local/state/qdl-v2/releases/v2.2.5/query-ab-20261020c/` | `SHA256SUMS` in that folder; receipt `d3899b22...`, byte compare `41ebcc3c575e3fb1cb37ee069cd5eff156bb0ed7ef0dd4b0b5becc51e22ae7e4`, alpha byte compare `c884e495ee2bc2f9ac6414b77d7fc1479c1ca1dc84a838308da15bcd41063b0f` | | Endpoint report | [endpoint-report.json](endpoint-report.json) | in certificate.json `endpoint_report_sha256` | ## 4. Gates @@ -149,6 +149,21 @@ sync paused), every triple valid at the first attempt: `stream_cursor`, per-row `cursor`, `quality.freshness_ms`, `quality.provider_session_liveness_ms`), and the bodies are byte-identical after masking exactly those values (10 BAR 1m x 1,000 rows each included). +**Alpha DR warmup byte compare (P1b, same session 06:10-06:13Z, `query-ab-20261020/byte-compare-alpha.json` +`c884e495ee2bc2f9ac6414b77d7fc1479c1ca1dc84a838308da15bcd41063b0f`): PASS.** The Data Layer requests of the TS +DR02/DR03 alpha read probe (`scripts/p184_dr_alpha_reads.py:99-138`) for alpha-binance r16 and alpha-okx r15, BAR 1m, +2 passes, 48 triples, all valid at the first attempt: +- per consumer: the instrument listing the resolver pages through (2 pages); warmup limit 5 for each of the 5 + symbols, 700 and 10,000 for the first; limit 10,001 (typed refusal: 400 on both images, bodies equal outside + `request_id`); the universe batch (5 x 200 rows, `require_all` false) and the mixed batch (limit 10; the unknown + symbol fails at client-side resolution, so the Data Layer sees one item); +- statuses 44 x 200 and 4 x 400, equal on both images; Content-Length equals the body length (up to 29.3 MB for + 10,000 rows) and no Transfer-Encoding; bodies byte-identical after masking the same per-request paths (also + inside batch items). +- alpha-binance used its new-generation leaf (same CN/SAN as r135) with the registered r135 JWT key; alpha-okx its + r135 leaf and JWT. The requirement fields are the manifests' (the server-admitted form); the alpha runtime's own + resolve/projection code is not exercised. + **P1 superseded.** The first issue of this certificate proposed P1 (scope D3 (b) out as NOT_MEASURED). It is not part of this certificate; the measurement above replaced it. diff --git a/upgrade/evidence/releases/v2.2.5/certificate.json b/upgrade/evidence/releases/v2.2.5/certificate.json index fffb9cae..af504e08 100644 --- a/upgrade/evidence/releases/v2.2.5/certificate.json +++ b/upgrade/evidence/releases/v2.2.5/certificate.json @@ -3,7 +3,7 @@ "release": "v2.2.5", "previous_published_release": "v2.2.4", "status": "PASS", - "status_basis": "PASS: every gate inherited from v2.2.4 with its delta proof, or measured; G5 delta proof D3 (a)-(d) complete, D3 (b) concurrent hot-read latency measured by the pre-registered isolated A/B of 2026-10-20 (query-ab-20261020, verdict PASS: paired p95/p99 deltas new-old mean -41.9 / -19.5 ms; 2 maintenance runs 131/147 ms inside the scored windows; DR warmup byte compare PASS 65/65)", + "status_basis": "PASS: every gate inherited from v2.2.4 with its delta proof, or measured; G5 delta proof D3 (a)-(d) complete, D3 (b) concurrent hot-read latency measured by the pre-registered isolated A/B of 2026-10-20 (query-ab-20261020, verdict PASS: paired p95/p99 deltas new-old mean -41.9 / -19.5 ms; 2 maintenance runs 131/147 ms inside the scored windows; DR warmup byte compare PASS 65/65; alpha DR02/DR03 byte compare PASS 24 shapes x 2)", "post_hoc_decisions": [], "status_rule": "PASS only with no FAIL gate, every inherited gate's delta proof met, R1/R2/R3/R4 PASS, no NOT_MEASURED item upgraded, and required CI green on the PR head (CERTIFICATE.md section 1; inheritance matrix fixed before the window in CERTIFICATE_SCOPE.md).", "classification": "SCOPED_DATA_LAYER_CONFIG_CERT_QUERY_DELTA_RELEASE_INHERITING_V224_GATES_PASS_SINGLE_HOST_NOT_HA", @@ -179,7 +179,7 @@ "G13": "INHERITED 76/76 (writer 2deb90b0 unchanged); window BOOTSTRAP -> STRICT READY 64/64", "G14": "INHERITED; no R4 CPU sample recorded (predeclared not a gate)" }, - "endpoint_report_sha256": "aece31e4814a4aa52caced2ffef55e1d892cfa73ae0bc9ecbae360cc776b8cb4", + "endpoint_report_sha256": "72cdd0c99915dfc180c44d83588929ec84d42b33986a0536a4e973c787f68781", "sdk": { "name": "qdl-sdk", "version": "2.4.1", @@ -215,7 +215,7 @@ "writer": "unchanged image; identity mount follows the generation (render.json rollback commands in the window dir)" }, "evidence_sha256": { - "upgrade/evidence/releases/v2.2.5/CERTIFICATE.md": "f190e2de86087c21810a0f4d7f71813df549f0cf567b3b6dc549acc4a2d7a483", + "upgrade/evidence/releases/v2.2.5/CERTIFICATE.md": "4cc9b2b65213ba0209336f830eb855cebc28c5083f8bcaaf3e95662befc274c9", "upgrade/evidence/releases/v2.2.5/RELEASE_NOTES.md": "bb3a7c700aa5ece1a6b93eb2910bebf61305ab3d1fa7986a8ec0bafd15f45615", "upgrade/evidence/releases/v2.2.5/CERTIFICATE_SCOPE.md": "0bbdec1ecdb267b1a0f3c8518bac26f5a776c31f774e90d068a2491fe864cd5b", "upgrade/evidence/releases/v2.2.5/MAINTENANCE_WINDOW_PACKET.md": "eadb4fe727aabeb9912570dd044770191f9f0c7bf061d21a8ac312bf1ad288bf", @@ -250,13 +250,15 @@ "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/tls-verify.out": "d271178827e273c9702735c97a4e8c961cffb8c1305878525a2b98f5b583dd1b", "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12a-ready.json": "452c464de3727e0fc3c4ca5fac194ae6781be9c39ba3e7781277f20f27c3cdd4", "upgrade/evidence/releases/v2.2.5/window-20261020T0128Z/w12b-ready.json": "3879b063cb2aaffcac13eb519cb9ec8e7f2f1062af85e21492acc8990461c2dd", - "upgrade/evidence/releases/v2.2.5/query-ab-20261020/SHA256SUMS": "e8052f803714089ccea2f98ef32b1aee89f8fa03240b54871b89ab60cad01c40", + "upgrade/evidence/releases/v2.2.5/query-ab-20261020/SHA256SUMS": "2591909b1f4463028d0823111fcc9d8ca759a29d23a91609b1365f29d7c8da18", "upgrade/evidence/releases/v2.2.5/query-ab-20261020/byte-compare.json": "41ebcc3c575e3fb1cb37ee069cd5eff156bb0ed7ef0dd4b0b5becc51e22ae7e4", "upgrade/evidence/releases/v2.2.5/query-ab-20261020/compare-rerun.json": "188e5a1ef6efb181d80da873437bbe723c4c11dde9ebfc808996c8902d1031c9", - "upgrade/evidence/releases/v2.2.5/query-ab-20261020/foreign.jsonl": "ca9aaf2ce46204739820d6fd73ac7d67599e9b0debd6218242d334be4db10ab3", + "upgrade/evidence/releases/v2.2.5/query-ab-20261020/foreign.jsonl": "000e4804f61c91e05a1ad381dde1bd1218e6346867afc02fba5c5bfe6af65971", "upgrade/evidence/releases/v2.2.5/query-ab-20261020/prereg.json": "0f2f00b43f1a1e28fedd055d90ca9f01dcd2376eb5e9d2053936b5cec081d924", "upgrade/evidence/releases/v2.2.5/query-ab-20261020/receipt.json": "d3899b2232c8cf874924d5d825a47e3e24fb9c8ee95ec70b62e9df3e73609d74", - "scripts/v225_query_hot_read_ab.py": "1d6aa8e6003ea7e0f73dcab136d03843cf7bda65c2577fbcaecdc0b081ef6836" + "scripts/v225_query_hot_read_ab.py": "c34be13752d56cc989da132de835b3a090b138f39a6a6a5e8525091a79faf85e", + "upgrade/evidence/releases/v2.2.5/query-ab-20261020/byte-compare-alpha.json": "c884e495ee2bc2f9ac6414b77d7fc1479c1ca1dc84a838308da15bcd41063b0f", + "upgrade/evidence/releases/v2.2.5/query-ab-20261020/compare-alpha.json": "aafe1e9d5ab48c983e93f51667af4f7cc59a8bcd867768e01d0acd0c2ea86f3f" }, "evidence_sha256_note": "the .md entries are the files as committed with this certificate; certificate.json cannot list its own sha256", "superseded_proposals": [ @@ -292,8 +294,10 @@ "prereg_commit": "0bba638525ee0f3353196add403a39db3fc8a59b", "session_tool_commits": [ "543ddf1810713b198713549f669bd93e4ea996df (arms + first BC)", - "b5b36e7272de06bc5e230d22eef7c96e64bf0374 (BC re-run)" + "b5b36e7272de06bc5e230d22eef7c96e64bf0374 (BC re-run)", + "4e87da2ba32ec0dad8722a7e97adfe9665eeebd4 (P1b alpha BC)" ], - "session": "~/.local/state/qdl-v2/releases/v2.2.5/query-ab-20261020c (attempts 1 query-ab-20261020 and 2 query-ab-20261020b measured nothing: harness mount defects, stopped)" + "session": "~/.local/state/qdl-v2/releases/v2.2.5/query-ab-20261020c (attempts 1 query-ab-20261020 and 2 query-ab-20261020b measured nothing: harness mount defects, stopped)", + "byte_compare_alpha_sha256": "c884e495ee2bc2f9ac6414b77d7fc1479c1ca1dc84a838308da15bcd41063b0f" } } diff --git a/upgrade/evidence/releases/v2.2.5/endpoint-report.json b/upgrade/evidence/releases/v2.2.5/endpoint-report.json index 8f6c9d0c..6c41c26f 100644 --- a/upgrade/evidence/releases/v2.2.5/endpoint-report.json +++ b/upgrade/evidence/releases/v2.2.5/endpoint-report.json @@ -82,6 +82,27 @@ "('stream_cursor',)" ] }, + "byte_compare_alpha": { + "requirements": 24, + "scope": "P1b: alpha DR02/DR03 read shapes (TS scripts/p184_dr_alpha_reads.py:99-138) at the Data Layer request level; alpha-binance r16 + alpha-okx r15 BAR 1m", + "sha256": "c884e495ee2bc2f9ac6414b77d7fc1479c1ca1dc84a838308da15bcd41063b0f", + "status_counts": { + "200": 44, + "400": 4 + }, + "triples": 48, + "verdict": "PASS", + "volatile_paths": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('results', *, 'data', 'data', *, 'cursor')", + "('results', *, 'data', 'data', *, 'quality', 'freshness_ms')", + "('results', *, 'data', 'request_id')", + "('results', *, 'data', 'stream_cursor')", + "('stream_cursor',)" + ] + }, "byte_compare_sha256": "41ebcc3c575e3fb1cb37ee069cd5eff156bb0ed7ef0dd4b0b5becc51e22ae7e4", "concurrency": { "foreign_test_like_containers_seen": [ diff --git a/upgrade/evidence/releases/v2.2.5/query-ab-20261020/SHA256SUMS b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/SHA256SUMS index 4f9cc28d..64939d2b 100644 --- a/upgrade/evidence/releases/v2.2.5/query-ab-20261020/SHA256SUMS +++ b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/SHA256SUMS @@ -1,9 +1,12 @@ 0f2f00b43f1a1e28fedd055d90ca9f01dcd2376eb5e9d2053936b5cec081d924 prereg.json 188e5a1ef6efb181d80da873437bbe723c4c11dde9ebfc808996c8902d1031c9 compare-rerun.json +aafe1e9d5ab48c983e93f51667af4f7cc59a8bcd867768e01d0acd0c2ea86f3f compare-alpha.json d3899b2232c8cf874924d5d825a47e3e24fb9c8ee95ec70b62e9df3e73609d74 receipt.json 41ebcc3c575e3fb1cb37ee069cd5eff156bb0ed7ef0dd4b0b5becc51e22ae7e4 byte-compare.json -ca9aaf2ce46204739820d6fd73ac7d67599e9b0debd6218242d334be4db10ab3 foreign.jsonl +c884e495ee2bc2f9ac6414b77d7fc1479c1ca1dc84a838308da15bcd41063b0f byte-compare-alpha.json +000e4804f61c91e05a1ad381dde1bd1218e6346867afc02fba5c5bfe6af65971 foreign.jsonl d613f3f90dd5fb9c54bf094e8f6c6c8b0fce405b019150f355121a1412aeed3c cmp-out/byte-compare-raw.json +8321f47993b37260b287db62ee06f8ee3dbc25eb89e2d91df40195714453e522 cmp-out/byte-compare-alpha-raw.json ca8dbab77007e4b7aac7fe761d7bb8aa99d0aa6dcc4c4f8c654f3d2581f8b7bb arm-A1/hot.jsonl ca6f7ba9b599e5abaf2e063015df1d477c0a02d42cd2d85cb1ce28acaf393afb arm-A2/hot.jsonl 00d4756ecf87736ea483de8232a573a724ae1608467fa40dccec39d918f41c51 arm-B1/hot.jsonl @@ -17,4 +20,5 @@ c9a05abafcd994e270df2293c48c257b77ecf4c1e63925f60111102e46f77e3f arm-A2/qdl-hr- e363fda60874fa1209cbe901f238dbb937d92e055c726e2a9ad31ad8c1d9697f arm-B1/qdl-hr-q-B1.log 7c71707e03ff702811c77f5907843cce27fbd09ab918bbe0b73e68758a1949ea arm-B2/qdl-hr-q-B2.log 5f0cbcd643f081d00a56f48569220f0a5feaaa629822b1bb78eb24b3c9bb9430 cmp-rerun/driver.out +1da2cb01c762638a78beffe28606fac289cb7e8de09f0616436c2126d2b37766 cmp-alpha/driver.out 7887ae16f42d17e1fb0c5fd177917910e253b8c94b493b3e4be40398db23becd cmp/driver.out diff --git a/upgrade/evidence/releases/v2.2.5/query-ab-20261020/byte-compare-alpha.json b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/byte-compare-alpha.json new file mode 100644 index 00000000..ea3d2b56 --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/byte-compare-alpha.json @@ -0,0 +1,1616 @@ +{ + "schema": "qdl.v225.query-warmup-byte-compare.v1", + "scope": "P1b: alpha DR02/DR03 read shapes (TS scripts/p184_dr_alpha_reads.py:99-138) at the Data Layer request level; alpha-binance r16 + alpha-okx r15 BAR 1m", + "old_image": "sha256:3e9e4d3add0f35c5d4b4796c785a35b466c326d3328184f396182b5f51367fff", + "new_image": "sha256:753604f8abaa866e2de30c7ccaf36168986bc6991550ee326d53e51b83d1550a", + "prereg_rule": "for every TS r11 requirement, in each of 2 passes, a valid triple (A, B, A' = second request to A, issued together with the sync paused) exists within 3 attempts; valid = A and A' differ only in scalar leaves (V); PASS when for every valid triple: status A == B, content-type A == B, Content-Length header == body length on A and B, no Transfer-Encoding, the JSON leaf paths where A and B differ are a subset of V, and the bodies are byte-equal after replacing the raw values at V by one placeholder", + "prereg_sha256": "0f2f00b43f1a1e28fedd055d90ca9f01dcd2376eb5e9d2053936b5cec081d924", + "requirements": 24, + "triples": 48, + "status_counts_A": { + "200": 44, + "400": 4 + }, + "volatile_paths_seen": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('results', *, 'data', 'data', *, 'cursor')", + "('results', *, 'data', 'data', *, 'quality', 'freshness_ms')", + "('results', *, 'data', 'request_id')", + "('results', *, 'data', 'stream_cursor')", + "('stream_cursor',)" + ], + "problems": [], + "verdict": "PASS", + "per_requirement": { + "00:binance:instruments:p1:binance:instruments:p1": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 146947, + 146947 + ], + "content_length": [ + "146947", + "146947" + ], + "rows": null, + "volatile_path_count": 0, + "volatile_path_patterns": [], + "sha256": { + "A": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57", + "B": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57" + }, + "normalized_sha256": { + "A": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57", + "B": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 146947, + 146947 + ], + "content_length": [ + "146947", + "146947" + ], + "rows": null, + "volatile_path_count": 0, + "volatile_path_patterns": [], + "sha256": { + "A": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57", + "B": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57" + }, + "normalized_sha256": { + "A": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57", + "B": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57" + } + } + ], + "01:binance:instruments:p2:binance:instruments:p2": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 6741, + 6741 + ], + "content_length": [ + "6741", + "6741" + ], + "rows": null, + "volatile_path_count": 0, + "volatile_path_patterns": [], + "sha256": { + "A": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928", + "B": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928" + }, + "normalized_sha256": { + "A": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928", + "B": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 6741, + 6741 + ], + "content_length": [ + "6741", + "6741" + ], + "rows": null, + "volatile_path_count": 0, + "volatile_path_patterns": [], + "sha256": { + "A": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928", + "B": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928" + }, + "normalized_sha256": { + "A": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928", + "B": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928" + } + } + ], + "02:binance:warmup5:8aedd349-6999-5874-b0dd-34c6451c0b3a:8aedd349-6999-5874-b0dd-34c6451c0b3a": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15624, + 15624 + ], + "content_length": [ + "15624", + "15624" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "bc7b816bce3d2c8b7b7b9e4f4c6e3d45bab9ada4dba04b9ad7f6ffaeb5d2287c", + "B": "446fc93c67242c1878e3cf984dc728b7e128d6ec9f5ec9b88ef46dafa88cc672" + }, + "normalized_sha256": { + "A": "e2e9ba441480be3641d7e5ebf0c4f40dc8a26943f74cba136ecf2d3d7f38b042", + "B": "e2e9ba441480be3641d7e5ebf0c4f40dc8a26943f74cba136ecf2d3d7f38b042" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15593, + 15593 + ], + "content_length": [ + "15593", + "15593" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "a85088baa9780a489b2c265b10d14440933901ab1108b21a868475500c5ee1fd", + "B": "5e07b7d859b1441cc6db2e902b301dae5b80798f0c0dd2abc291655452a6bcd9" + }, + "normalized_sha256": { + "A": "d277985ee7c9b920f82484c059a1d82df320416ac9e1ba8bdb278e9b2be98286", + "B": "d277985ee7c9b920f82484c059a1d82df320416ac9e1ba8bdb278e9b2be98286" + } + } + ], + "03:binance:warmup5:a953e16e-7138-5562-b5e8-c337a44d0b65:a953e16e-7138-5562-b5e8-c337a44d0b65": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15624, + 15624 + ], + "content_length": [ + "15624", + "15624" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "43880a226c86e1dc71f851570993a9891fdd54b02e5857040cacf711ca7b928a", + "B": "8b820eb49223ad1717b99aea81119e871574e7d1d684127269aa50ce7d869dbf" + }, + "normalized_sha256": { + "A": "4fb633cb4a43f9ed084658d983ee95492f4a5b1356614071317bfa2c087ca71c", + "B": "4fb633cb4a43f9ed084658d983ee95492f4a5b1356614071317bfa2c087ca71c" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15597, + 15597 + ], + "content_length": [ + "15597", + "15597" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "a864e8bb23f503e507b72f4ecde806fc52324fc3f205e7b14276c4324208ec6e", + "B": "05d7d33e5ac80fc8e52d4463500dc8e4e0bcd13114dd5752a94813d5d8cd4319" + }, + "normalized_sha256": { + "A": "c45ed7fa6c9adb7064134afb0731e25ab4e0f02745a817964d20b07ae6ea5c1e", + "B": "c45ed7fa6c9adb7064134afb0731e25ab4e0f02745a817964d20b07ae6ea5c1e" + } + } + ], + "04:binance:warmup5:b2d78145-b541-58e2-941b-06c44c65e45f:b2d78145-b541-58e2-941b-06c44c65e45f": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15554, + 15554 + ], + "content_length": [ + "15554", + "15554" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "ff050270ca63f8261ddbcd80ab23eb4ec76a454d333b3d187b7e49cb537fac6a", + "B": "53773b526b38d15f493449feb4c53b51417e75e356593bebf866b7da13dcf39d" + }, + "normalized_sha256": { + "A": "3f366e5cee547acd18f8ef57733157afe87925cc934b2513a9db70f6b07da566", + "B": "3f366e5cee547acd18f8ef57733157afe87925cc934b2513a9db70f6b07da566" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15543, + 15543 + ], + "content_length": [ + "15543", + "15543" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "ff0cf8bb4c3b030c511044da35a9039e6703764524fdc4f15d48de5eed94414c", + "B": "cbe78934dc0b8f442ef2136030cd574dc906b0b2976db6382d4b5db78804293b" + }, + "normalized_sha256": { + "A": "688d5a00b77ea28478743e5a8387ce680771642a116e5ab168620d9307b623db", + "B": "688d5a00b77ea28478743e5a8387ce680771642a116e5ab168620d9307b623db" + } + } + ], + "05:binance:warmup5:e4ce7249-a4e8-5073-beb8-dab908596c34:e4ce7249-a4e8-5073-beb8-dab908596c34": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15665, + 15665 + ], + "content_length": [ + "15665", + "15665" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "5dd1be6ae984df405974c982588d6d53f70738b9552c6da7715e2253a87d4caa", + "B": "42c88169c52a24957a5f39c3847550fec6a99abf3129e5335d7ae67beb852aa5" + }, + "normalized_sha256": { + "A": "1e38d2ccf1eb0688f7444b80e732d5a2c13fd16173fca82f73869bbdfd18ccb5", + "B": "1e38d2ccf1eb0688f7444b80e732d5a2c13fd16173fca82f73869bbdfd18ccb5" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15634, + 15634 + ], + "content_length": [ + "15634", + "15634" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "a8de375f0d97f5add44ad1af1ad6a48031cba056cc7eeeef2f3af04e2d7344ea", + "B": "9b7070ec524cf5924077563c76f884816bc73ec8d1fc3e87ce38c1335755c78e" + }, + "normalized_sha256": { + "A": "c244ef0e9cef8eaf080d44d67adecd12e46f5ec916fed7bbd165fd0813d6a9e0", + "B": "c244ef0e9cef8eaf080d44d67adecd12e46f5ec916fed7bbd165fd0813d6a9e0" + } + } + ], + "06:binance:warmup5:ee93fabf-68df-5b50-8924-51bf25a5a757:ee93fabf-68df-5b50-8924-51bf25a5a757": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15635, + 15635 + ], + "content_length": [ + "15635", + "15635" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "01d991ed7ab2aeb1e94b59199966a3ec2d0bff579331bfb99e87dc3acc403fb6", + "B": "c7065d7956eca724088e2c6b873304cf143e8a0a1fad462270476b3bd747ede7" + }, + "normalized_sha256": { + "A": "970920b7c313c6e4a65811502d1fd17680d2bac9ceab0b04a2235a5dd98a6539", + "B": "970920b7c313c6e4a65811502d1fd17680d2bac9ceab0b04a2235a5dd98a6539" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15612, + 15612 + ], + "content_length": [ + "15612", + "15612" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "8b6de578a02505a63b14ab1a834dfccf01904ffbcaea755ab3d1bda730765e33", + "B": "c6daa757ea23b611f4e37fa3dc1c23e82d27b5c2dee7583295cc1a87ff80323b" + }, + "normalized_sha256": { + "A": "a3e56908f6da8745f78bdf1ecffcf4fbe5cdacf41be1f54eae179c545f9b8f95", + "B": "a3e56908f6da8745f78bdf1ecffcf4fbe5cdacf41be1f54eae179c545f9b8f95" + } + } + ], + "07:binance:warmup700:8aedd349-6999-5874-b0dd-34c6451c0b3a:8aedd349-6999-5874-b0dd-34c6451c0b3a": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2027200, + 2027200 + ], + "content_length": [ + "2027200", + "2027200" + ], + "rows": 700, + "volatile_path_count": 1402, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "9a1fdfdf0007718c9ca0c5b3bf0d97aa302be0ac269be1b68bf717dc1ffda285", + "B": "f70520e92eeece4c931c7c2b5b085eefe31463e4100680da0e7ff0a18c85c6dc" + }, + "normalized_sha256": { + "A": "541852e9ba99d58affe8d470cb06c12294df5ff680687d934656ae1e10b36649", + "B": "541852e9ba99d58affe8d470cb06c12294df5ff680687d934656ae1e10b36649" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2027175, + 2027175 + ], + "content_length": [ + "2027175", + "2027175" + ], + "rows": 700, + "volatile_path_count": 1402, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "04a1d9dedf17f2c6810457a5118d7836e60c5d7ffaf10111a1a9523f4b128d26", + "B": "1504338120c1cae9bcc84a77416cf3a6f43b0e3406b930a0e38669a9d4f78215" + }, + "normalized_sha256": { + "A": "3c5f6554bf4d1d97c868cfbd8b319ac6602718527a85ef9c18611dba83866ea1", + "B": "3c5f6554bf4d1d97c868cfbd8b319ac6602718527a85ef9c18611dba83866ea1" + } + } + ], + "08:binance:warmup10000:8aedd349-6999-5874-b0dd-34c6451c0b3a:8aedd349-6999-5874-b0dd-34c6451c0b3a": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 28971548, + 28971548 + ], + "content_length": [ + "28971548", + "28971548" + ], + "rows": 10000, + "volatile_path_count": 20002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "3d331c48b28282779607b3eb5b597c50ab7d4d077fea8bae60fb3bd962e52a3b", + "B": "30772930083aee91b6ea0bb9ddb969af435b36975721fb32946d5c20167420ac" + }, + "normalized_sha256": { + "A": "964f84ca45b98caf271ecaa98efffb0b7602f17ad096c87b44262da4c9ea70f1", + "B": "964f84ca45b98caf271ecaa98efffb0b7602f17ad096c87b44262da4c9ea70f1" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 28971515, + 28971515 + ], + "content_length": [ + "28971515", + "28971515" + ], + "rows": 10000, + "volatile_path_count": 20002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "4658f70472abe1ccfa078bda58754ed9b67a9818a3c8e9642eaf64b46c52e65a", + "B": "4eb7b070eaf74e7061fb18182a09a35853602a339c535ecae1ce875ca807844b" + }, + "normalized_sha256": { + "A": "901faf0c310ef3b213acd9f3e459e8bca0a25c95d74e5d0b5971c5ad0772f503", + "B": "901faf0c310ef3b213acd9f3e459e8bca0a25c95d74e5d0b5971c5ad0772f503" + } + } + ], + "09:binance:warmup10001:8aedd349-6999-5874-b0dd-34c6451c0b3a:8aedd349-6999-5874-b0dd-34c6451c0b3a": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 400, + 400 + ], + "length": [ + 232, + 232 + ], + "content_length": [ + "232", + "232" + ], + "rows": null, + "volatile_path_count": 1, + "volatile_path_patterns": [ + "('request_id',)" + ], + "sha256": { + "A": "efb3147375a27ac2bba107e2ce040063ba68ad8cafdde89b1854585172e416bb", + "B": "005672fb766562d4dba6c49eebaf7be1df9fa8364f88a312523b0e558bbe0ac4" + }, + "normalized_sha256": { + "A": "d5922198bbb514357d94a06d7e29962014f5d25b901c3a7e8de5affb25ba2f36", + "B": "d5922198bbb514357d94a06d7e29962014f5d25b901c3a7e8de5affb25ba2f36" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 400, + 400 + ], + "length": [ + 232, + 232 + ], + "content_length": [ + "232", + "232" + ], + "rows": null, + "volatile_path_count": 1, + "volatile_path_patterns": [ + "('request_id',)" + ], + "sha256": { + "A": "e4c335d4caf332b9b1e0b94b8ccd4e64b00089ff747208d25ac3983979b83bce", + "B": "c42147172076abfb1788661212b8354fb02e333bf2ac672ee303d9994c433da3" + }, + "normalized_sha256": { + "A": "d5922198bbb514357d94a06d7e29962014f5d25b901c3a7e8de5affb25ba2f36", + "B": "d5922198bbb514357d94a06d7e29962014f5d25b901c3a7e8de5affb25ba2f36" + } + } + ], + "10:binance:batch-universe200:binance:batch-universe200": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2900409, + 2900409 + ], + "content_length": [ + "2900409", + "2900409" + ], + "rows": null, + "volatile_path_count": 2011, + "volatile_path_patterns": [ + "('request_id',)", + "('results', *, 'data', 'data', *, 'cursor')", + "('results', *, 'data', 'data', *, 'quality', 'freshness_ms')", + "('results', *, 'data', 'request_id')", + "('results', *, 'data', 'stream_cursor')" + ], + "sha256": { + "A": "1b688fd9f193b45667bcca17da6c9b51e25b58dc056178f2ff5e25ab186ec22c", + "B": "59634f90179d3d840ec00772935c83252af2ed260aee5021cf4f2bad684a9d63" + }, + "normalized_sha256": { + "A": "f88492836d56def172e360b6180ac890a73cc9a97933089809d1b50bbfc19a61", + "B": "f88492836d56def172e360b6180ac890a73cc9a97933089809d1b50bbfc19a61" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2900392, + 2900392 + ], + "content_length": [ + "2900392", + "2900392" + ], + "rows": null, + "volatile_path_count": 2011, + "volatile_path_patterns": [ + "('request_id',)", + "('results', *, 'data', 'data', *, 'cursor')", + "('results', *, 'data', 'data', *, 'quality', 'freshness_ms')", + "('results', *, 'data', 'request_id')", + "('results', *, 'data', 'stream_cursor')" + ], + "sha256": { + "A": "3d6697c1d4383c96263d56ce7c6e5fb1e3a90477ce73140b1c07019a59e82a68", + "B": "f87c970549ed43594292285f392ac897a281f095a9ab7278f377d86911095e24" + }, + "normalized_sha256": { + "A": "597fbd962257a1ca2a274f974907c64105d6feef42275ecdc90f92e5664ccbc1", + "B": "597fbd962257a1ca2a274f974907c64105d6feef42275ecdc90f92e5664ccbc1" + } + } + ], + "11:binance:batch-mixed10 (the unknown symbol fails at resolve, client side):binance:batch-mixed10 (the unknown symbol fails at resolve, client side)": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 30327, + 30327 + ], + "content_length": [ + "30327", + "30327" + ], + "rows": null, + "volatile_path_count": 23, + "volatile_path_patterns": [ + "('request_id',)", + "('results', *, 'data', 'data', *, 'cursor')", + "('results', *, 'data', 'data', *, 'quality', 'freshness_ms')", + "('results', *, 'data', 'request_id')", + "('results', *, 'data', 'stream_cursor')" + ], + "sha256": { + "A": "a82a476107caa3eb666ecd01dbb21d091ec27d8447636ca407a4e87e0d8e0672", + "B": "f9e79cecbde357108b1616b87df17f5d3042810386c7fbb8f79d097bfbd412a2" + }, + "normalized_sha256": { + "A": "5790954ad26cc33f5811c11de0268e586f93a21118aa014cf66492779709b3f0", + "B": "5790954ad26cc33f5811c11de0268e586f93a21118aa014cf66492779709b3f0" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 30321, + 30321 + ], + "content_length": [ + "30321", + "30321" + ], + "rows": null, + "volatile_path_count": 23, + "volatile_path_patterns": [ + "('request_id',)", + "('results', *, 'data', 'data', *, 'cursor')", + "('results', *, 'data', 'data', *, 'quality', 'freshness_ms')", + "('results', *, 'data', 'request_id')", + "('results', *, 'data', 'stream_cursor')" + ], + "sha256": { + "A": "d36f7b0956a35d9c0f9d315f7f57080c0092ca315fb5218aed16abc7546276b3", + "B": "e7e906caf40efa140ac8ac47a2be3a1b3103a9bb28be942739c9f132ded60b50" + }, + "normalized_sha256": { + "A": "2d52b4f1b24a78a769e3d775ce582b0fadd37e63db545b3a59cb5f7fc2ca7092", + "B": "2d52b4f1b24a78a769e3d775ce582b0fadd37e63db545b3a59cb5f7fc2ca7092" + } + } + ], + "12:okx:instruments:p1:okx:instruments:p1": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 146947, + 146947 + ], + "content_length": [ + "146947", + "146947" + ], + "rows": null, + "volatile_path_count": 0, + "volatile_path_patterns": [], + "sha256": { + "A": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57", + "B": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57" + }, + "normalized_sha256": { + "A": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57", + "B": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 146947, + 146947 + ], + "content_length": [ + "146947", + "146947" + ], + "rows": null, + "volatile_path_count": 0, + "volatile_path_patterns": [], + "sha256": { + "A": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57", + "B": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57" + }, + "normalized_sha256": { + "A": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57", + "B": "8546a80be6fcd6f3a2c7285d8bf1b4308f7600837f526706afc101052f6dde57" + } + } + ], + "13:okx:instruments:p2:okx:instruments:p2": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 6741, + 6741 + ], + "content_length": [ + "6741", + "6741" + ], + "rows": null, + "volatile_path_count": 0, + "volatile_path_patterns": [], + "sha256": { + "A": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928", + "B": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928" + }, + "normalized_sha256": { + "A": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928", + "B": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 6741, + 6741 + ], + "content_length": [ + "6741", + "6741" + ], + "rows": null, + "volatile_path_count": 0, + "volatile_path_patterns": [], + "sha256": { + "A": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928", + "B": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928" + }, + "normalized_sha256": { + "A": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928", + "B": "e165d74e31b5c7d4f943b681ede22a476c87d0e4fc713d2c547460fca51ea928" + } + } + ], + "14:okx:warmup5:6c7c9256-2905-5c75-a149-fa0ac36bbbc7:6c7c9256-2905-5c75-a149-fa0ac36bbbc7": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15747, + 15747 + ], + "content_length": [ + "15747", + "15747" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "d6e153a270f14c4111f95d69ad46b69ad80e482d96e3cff5a8b12633b63f76fd", + "B": "88e26abdb98117e3c3b8651cf852ab03c0614215525153e35ab055cfad5311f7" + }, + "normalized_sha256": { + "A": "603d80d571653b05414dc310b6d5646fe9cffdd8a7a94759fe14498735bdbe98", + "B": "603d80d571653b05414dc310b6d5646fe9cffdd8a7a94759fe14498735bdbe98" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15747, + 15747 + ], + "content_length": [ + "15747", + "15747" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "83f7cf7bda121121b8c697892d98cb22c266b1f81a763dfb56136ce3bf8bdfd6", + "B": "5e98c0c9f9d33752ea0252a38b4105f7ed2b52c2ce5d178e0dac5b334db48d80" + }, + "normalized_sha256": { + "A": "b90331e7074de54da0b62bf568ad3f043dc9ac6227a61f0a1e2c0407c969997b", + "B": "b90331e7074de54da0b62bf568ad3f043dc9ac6227a61f0a1e2c0407c969997b" + } + } + ], + "15:okx:warmup5:a6884fb3-1fa0-53e0-9621-d01ba5f9a2de:a6884fb3-1fa0-53e0-9621-d01ba5f9a2de": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15741, + 15741 + ], + "content_length": [ + "15741", + "15741" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "aa0ff4d00481971b9c1bb1aa2d7c64c0851e59d7bb8f699794515d60648f4629", + "B": "f4d7cae940c608ad62e2137f51b15dee19d0d5a41077203352656307faf77f97" + }, + "normalized_sha256": { + "A": "ae08ae5b873dfd7e2c84431dc5b8aa565035392c0da2c35c41f863242369939d", + "B": "ae08ae5b873dfd7e2c84431dc5b8aa565035392c0da2c35c41f863242369939d" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15741, + 15741 + ], + "content_length": [ + "15741", + "15741" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "8526187a3b73bcd3c12d788e38672b8948a0e4d114255a507ff73b13e6f311c2", + "B": "6880d6ccbe82c79ae49b3f68a19b8606830bf107317046f6df91942e859c162e" + }, + "normalized_sha256": { + "A": "44110754bfde3ca4c762dee01cc24c9c69b7614c5c7d95c21cdb865d9f89c136", + "B": "44110754bfde3ca4c762dee01cc24c9c69b7614c5c7d95c21cdb865d9f89c136" + } + } + ], + "16:okx:warmup5:e49b54ae-c23d-5351-9e64-47934aac28f8:e49b54ae-c23d-5351-9e64-47934aac28f8": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15817, + 15817 + ], + "content_length": [ + "15817", + "15817" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "ccd11ce9d9295f0fc20cf4fb249b8b20e940802caf1c53e4fa5bf0a32d4cad64", + "B": "ccd28a385c37c87a39a2f4b9769df42c6733ce37f632316c0c93b7b6ed63505d" + }, + "normalized_sha256": { + "A": "534a6a95b5442d1a4a061f514c9884c9cebf26130ab678d1729524ce66f452ad", + "B": "534a6a95b5442d1a4a061f514c9884c9cebf26130ab678d1729524ce66f452ad" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15811, + 15811 + ], + "content_length": [ + "15811", + "15811" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "5f4fd86d6f3ab5be9accdd2eddf89eec4a6812890289126b44eea6eee31b5b42", + "B": "584d9ad63543e1705c59b9bb2b9a5cbbb1440b62008792497638d8c652cce707" + }, + "normalized_sha256": { + "A": "2f7f3beac3acab90d88f7eb193bd203a83cc56a15a78a13de69f25ddbb6c895e", + "B": "2f7f3beac3acab90d88f7eb193bd203a83cc56a15a78a13de69f25ddbb6c895e" + } + } + ], + "17:okx:warmup5:f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3:f2e37e2b-1386-5a32-9b79-0fd39ec7a5a3": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15621, + 15621 + ], + "content_length": [ + "15621", + "15621" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "6561720b3a7d82e596c29097e0c61307e3f1db87498e4cd86154eb65c5156531", + "B": "b16b131985bb21ebe7cf2c2a72c595f53435e7b69d8bbb37920050c562b256cd" + }, + "normalized_sha256": { + "A": "7d236687acc6d4063868c33aa320a224db79412625db580ab3696ce139d1faf8", + "B": "7d236687acc6d4063868c33aa320a224db79412625db580ab3696ce139d1faf8" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15621, + 15621 + ], + "content_length": [ + "15621", + "15621" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "277bd7fa6057d129f17492fa8ab88f2a97ee8131003c92dadb383fc2e821139f", + "B": "26d530ea7dc9566b9440382042e2ec0cb608e9cc56bcffa85961bb2a1b8396dc" + }, + "normalized_sha256": { + "A": "56d4166d8ae67d7a89a2995f7e20ba02d6c73d9a1b72b019788ed876f55bd65f", + "B": "56d4166d8ae67d7a89a2995f7e20ba02d6c73d9a1b72b019788ed876f55bd65f" + } + } + ], + "18:okx:warmup5:fb26214c-7b9b-5961-95b2-55154755af0f:fb26214c-7b9b-5961-95b2-55154755af0f": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15754, + 15754 + ], + "content_length": [ + "15754", + "15754" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "601b6ab7f32164770632c8f20a02f9cb62e7b884f0caf0f8e3d5dc7bff74d19c", + "B": "6a5ce731e65f657708a274620bcf269f1fa2a9deb778fb2783c6ffc637e7b949" + }, + "normalized_sha256": { + "A": "303734edeeda011fcf6f970773b8c43b5c52d7d83c9f07f0e0a12457dd674707", + "B": "303734edeeda011fcf6f970773b8c43b5c52d7d83c9f07f0e0a12457dd674707" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 15754, + 15754 + ], + "content_length": [ + "15754", + "15754" + ], + "rows": 5, + "volatile_path_count": 12, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "bcf833a754f08c4b8254f4dc29f3862d1b341c598283272e1f4681306dc00ea0", + "B": "ead12db48471b7dfe32bedabf46d83b3ba31b159b89a207bf682a42fd010a95f" + }, + "normalized_sha256": { + "A": "a87ab04cac4adc402541a2bce476490287ccf91711fb960c9440fb28f355d527", + "B": "a87ab04cac4adc402541a2bce476490287ccf91711fb960c9440fb28f355d527" + } + } + ], + "19:okx:warmup700:6c7c9256-2905-5c75-a149-fa0ac36bbbc7:6c7c9256-2905-5c75-a149-fa0ac36bbbc7": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2050813, + 2050813 + ], + "content_length": [ + "2050813", + "2050813" + ], + "rows": 700, + "volatile_path_count": 1402, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "21bae11095b8b9583eeb0d01167974b6027bf7fe1fb70eaff2bac9fbdeace8ea", + "B": "87ce5c9604abb900a6bc1e66ab191fe170b9172297b7d27138b9d4ccb012406e" + }, + "normalized_sha256": { + "A": "b5e3429238820993947bbf5d0f4e0ef6d97eddba9ea45361c26d96b67a201e39", + "B": "b5e3429238820993947bbf5d0f4e0ef6d97eddba9ea45361c26d96b67a201e39" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2050816, + 2050816 + ], + "content_length": [ + "2050816", + "2050816" + ], + "rows": 700, + "volatile_path_count": 1402, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "e5ea45e4b704a61cf76aafb8bf0c1745c66a6a037ba6b994f96a735863b337f9", + "B": "c3b24403a04bec00ae1c46c01218bba913e14682f236adf62446d78d5ff3beb6" + }, + "normalized_sha256": { + "A": "0514f78b8e8cf6ca06a00e025a1db1d9e47484f358e19e83313ff933cda8f486", + "B": "0514f78b8e8cf6ca06a00e025a1db1d9e47484f358e19e83313ff933cda8f486" + } + } + ], + "20:okx:warmup10000:6c7c9256-2905-5c75-a149-fa0ac36bbbc7:6c7c9256-2905-5c75-a149-fa0ac36bbbc7": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 29313822, + 29313822 + ], + "content_length": [ + "29313822", + "29313822" + ], + "rows": 10000, + "volatile_path_count": 20002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "2fa1275ec8800a7194b4f8babad6ec6c0063225d1621e1b9b448f84716927096", + "B": "8094cc02d455b26464799676b786636efae223e6fc3fb464c7799e8de20f159b" + }, + "normalized_sha256": { + "A": "c3652d24d01b890b18edf72a69aa8f13bad5922cc9de8c5498891ab1226d8781", + "B": "c3652d24d01b890b18edf72a69aa8f13bad5922cc9de8c5498891ab1226d8781" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 29313816, + 29313816 + ], + "content_length": [ + "29313816", + "29313816" + ], + "rows": 10000, + "volatile_path_count": 20002, + "volatile_path_patterns": [ + "('data', *, 'cursor')", + "('data', *, 'quality', 'freshness_ms')", + "('request_id',)", + "('stream_cursor',)" + ], + "sha256": { + "A": "e8f741f0ed95a7844c0fdfeb040d6f493d40adbf64ea8fecfb0d5d64833d683a", + "B": "2439687f5f44dd6639eba8e2835f86a6c42e4fc66b62cde529d59c115611faeb" + }, + "normalized_sha256": { + "A": "9426d3dafc4ceea76becc4666389e079927085bd44592f6fe23c4028c669b354", + "B": "9426d3dafc4ceea76becc4666389e079927085bd44592f6fe23c4028c669b354" + } + } + ], + "21:okx:warmup10001:6c7c9256-2905-5c75-a149-fa0ac36bbbc7:6c7c9256-2905-5c75-a149-fa0ac36bbbc7": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 400, + 400 + ], + "length": [ + 232, + 232 + ], + "content_length": [ + "232", + "232" + ], + "rows": null, + "volatile_path_count": 1, + "volatile_path_patterns": [ + "('request_id',)" + ], + "sha256": { + "A": "1bbcb8fceb37fe460ae9e1d2c19a21c3e2e39d4102110cc5b03cdf99e7c2e92b", + "B": "3f3ed92e5bd1c8c3f061ee23a232a009482706b018ab938dd45d0c561ad22e25" + }, + "normalized_sha256": { + "A": "d5922198bbb514357d94a06d7e29962014f5d25b901c3a7e8de5affb25ba2f36", + "B": "d5922198bbb514357d94a06d7e29962014f5d25b901c3a7e8de5affb25ba2f36" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 400, + 400 + ], + "length": [ + 232, + 232 + ], + "content_length": [ + "232", + "232" + ], + "rows": null, + "volatile_path_count": 1, + "volatile_path_patterns": [ + "('request_id',)" + ], + "sha256": { + "A": "126fcd7ce6499fd0672c74cc0b5b31f669d4895854474e431eccbf45e97fdf87", + "B": "83e4672dc6a7fb1630f3e37b3a7b9874a1ebc8e6b501324fc7b7b71e36d4a38d" + }, + "normalized_sha256": { + "A": "d5922198bbb514357d94a06d7e29962014f5d25b901c3a7e8de5affb25ba2f36", + "B": "d5922198bbb514357d94a06d7e29962014f5d25b901c3a7e8de5affb25ba2f36" + } + } + ], + "22:okx:batch-universe200:okx:batch-universe200": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2930905, + 2930905 + ], + "content_length": [ + "2930905", + "2930905" + ], + "rows": null, + "volatile_path_count": 2011, + "volatile_path_patterns": [ + "('request_id',)", + "('results', *, 'data', 'data', *, 'cursor')", + "('results', *, 'data', 'data', *, 'quality', 'freshness_ms')", + "('results', *, 'data', 'request_id')", + "('results', *, 'data', 'stream_cursor')" + ], + "sha256": { + "A": "2b8e894f99c945baef5b0ef7376da8554dc9e74cdb0eaa6e2f562f60ab76eaec", + "B": "3f8409b07c0ee03d0b8336199231ccee43d016ad1869931bf092cc8a86962a17" + }, + "normalized_sha256": { + "A": "30db257c0bb333c95f8f3c4058ee918c64e69127a6eda4e7f08ebcc8f75430eb", + "B": "30db257c0bb333c95f8f3c4058ee918c64e69127a6eda4e7f08ebcc8f75430eb" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 2930893, + 2930893 + ], + "content_length": [ + "2930893", + "2930893" + ], + "rows": null, + "volatile_path_count": 2011, + "volatile_path_patterns": [ + "('request_id',)", + "('results', *, 'data', 'data', *, 'cursor')", + "('results', *, 'data', 'data', *, 'quality', 'freshness_ms')", + "('results', *, 'data', 'request_id')", + "('results', *, 'data', 'stream_cursor')" + ], + "sha256": { + "A": "7f858d7c545b0910b776c516f5998b46fbfdba617c6243664e1af79574b95d41", + "B": "fe86264b71468e475d86707f4fe62250afc36871ceb28e630b70a2a97f5c896d" + }, + "normalized_sha256": { + "A": "c764ce4fe4c8afac19a00e4108b72474165e33d0062802fff1875beb368e6fcf", + "B": "c764ce4fe4c8afac19a00e4108b72474165e33d0062802fff1875beb368e6fcf" + } + } + ], + "23:okx:batch-mixed10 (the unknown symbol fails at resolve, client side):okx:batch-mixed10 (the unknown symbol fails at resolve, client side)": [ + { + "pass": 1, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 30673, + 30673 + ], + "content_length": [ + "30673", + "30673" + ], + "rows": null, + "volatile_path_count": 23, + "volatile_path_patterns": [ + "('request_id',)", + "('results', *, 'data', 'data', *, 'cursor')", + "('results', *, 'data', 'data', *, 'quality', 'freshness_ms')", + "('results', *, 'data', 'request_id')", + "('results', *, 'data', 'stream_cursor')" + ], + "sha256": { + "A": "2c2cb3cdf46a30efbdd798811c6bf197747955964c4146c5715c9ebe0548d283", + "B": "7016e936f36de3ae67cbbf881c3519c910d6b30dc0a8a24bbf6890fdf1264aff" + }, + "normalized_sha256": { + "A": "6262b2c5f79280440a9983956b7ef3715feb024f635f714f9f3425c7e7f77ce8", + "B": "6262b2c5f79280440a9983956b7ef3715feb024f635f714f9f3425c7e7f77ce8" + } + }, + { + "pass": 2, + "attempts": 1, + "ok": true, + "status": [ + 200, + 200 + ], + "length": [ + 30665, + 30665 + ], + "content_length": [ + "30665", + "30665" + ], + "rows": null, + "volatile_path_count": 23, + "volatile_path_patterns": [ + "('request_id',)", + "('results', *, 'data', 'data', *, 'cursor')", + "('results', *, 'data', 'data', *, 'quality', 'freshness_ms')", + "('results', *, 'data', 'request_id')", + "('results', *, 'data', 'stream_cursor')" + ], + "sha256": { + "A": "a7c35f5c36bfec7ae9c82908c8d96f67faa88fe32257fe964d8d0dd45b65dccf", + "B": "d143de672e29cfcb6c1e46435e2151b9e61ef98a064a96d3dbaa42282564b8f2" + }, + "normalized_sha256": { + "A": "91da3b7e1f470eaba3892c6a374f8ddc892d6e30d292cd17449715058c5dc80d", + "B": "91da3b7e1f470eaba3892c6a374f8ddc892d6e30d292cd17449715058c5dc80d" + } + } + ] + } +} diff --git a/upgrade/evidence/releases/v2.2.5/query-ab-20261020/compare-alpha.json b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/compare-alpha.json new file mode 100644 index 00000000..6911d32b --- /dev/null +++ b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/compare-alpha.json @@ -0,0 +1,46 @@ +{ + "schema": "qdl.v225.query-ab-prereg.v2", + "revision_note": "v2 (before any run) replaces v1 of commit 7d28d9cb: owner 2026-10-20 ~04:30Z: run concurrently with a foreign correctness-only lock, interleave arms, judge paired old-vs-new deltas, record foreign activity", + "images": { + "A_old": "sha256:3e9e4d3add0f35c5d4b4796c785a35b466c326d3328184f396182b5f51367fff", + "B_new": "sha256:753604f8abaa866e2de30c7ccaf36168986bc6991550ee326d53e51b83d1550a" + }, + "replica": "one Query replica per arm, production container spec of query_kn_1 except private cache/quota Redis, --cpus 1.0 --memory 2g (the IDR-129 arm shape)", + "order": "byte compare (A and B side by side), then interleaved arms A1 B1 A2 B2 (A = old, B = new), each a fresh replica", + "concurrency": "runs beside another agent's correctness-only job under its host lock (owner instruction); foreign activity sampled every 30 s", + "burst": { + "slices": 64, + "bursts": 6, + "gap_s": 10, + "settle_s": 5, + "rounds": 4, + "mix": "TS r11 BAR 1m x 1,000 rows (10 slices) + alpha-okx BAR 1m..1h cycled to 54 slices with rows 2500/5000/2500/5000/2500/5000/2500/10000 (the IDR-129 stage ladder); SDK 2.4 redirect/queued retry shape", + "note": "alpha-binance identities belong to the rotated CA, so alpha slices are alpha-okx only" + }, + "hot_reads": { + "driver": "open loop, fixed schedule (no coordinated omission), TS identity", + "request": "GET /v2/market-data/{uid}/snapshot, TS r11 QUOTE and TRADE requirements (EXECUTION), round robin", + "rate_hz": 10.0, + "rate_note": "4x the production rate so that a ~150 ms maintenance run overlaps reads (about 1.5 expected per run)", + "production_reference": "R4 soak 2026-10-20: 7261 QUOTE + 1800 TRADE in 60 min = 2.5/s over two replicas", + "phases": "pre (60 s before burst 1), scored (first burst start .. last burst end), post (60 s)" + }, + "maintenance": "the new image's default QDL_QUERY_MEMORY_SOFT_LIMIT_MIB (448); no manual gc/trim in any scored arm", + "rules": { + "HR1": "paired deltas over the pairs (A1,B1) and (A2,B2), scored hot reads (any HTTP status; transport errors counted apart): mean(p95_Bi - p95_Ai) <= max(0.10*mean(p95_Ai), 10 ms) and mean(p99_Bi - p99_Ai) <= max(0.10*mean(p99_Ai), 25 ms); each pair is reported", + "HR2": "coverage: the B arms together have >= 1 memory_maintenance run inside a scored window with >= 1 hot read overlapping it; otherwise INCONCLUSIVE (never PASS)", + "HR3": "bounded pause: every hot read overlapping a maintenance run has latency <= run_ms + p99 of that arm's non-overlapping scored reads + 50 ms, and every run_ms <= 500", + "HR4": "transport errors + HTTP 5xx summed over B arms <= summed over A arms + max(2, 0.5 % of the B arms' scored reads)", + "HR5": "non-200 share of scored reads over the B arms <= over the A arms + 1 percentage point", + "BC": "for every TS r11 requirement, in each of 2 passes, a valid triple (A, B, A' = second request to A, issued together with the sync paused) exists within 3 attempts; valid = A and A' differ only in scalar leaves (V); PASS when for every valid triple: status A == B, content-type A == B, Content-Length header == body length on A and B, no Transfer-Encoding, the JSON leaf paths where A and B differ are a subset of V, and the bodies are byte-equal after replacing the raw values at V by one placeholder", + "verdict": "PASS only when HR1-HR5 and BC all PASS; INCONCLUSIVE when HR2 is not met; FAIL otherwise", + "secondary": "RSS per burst, warmup latency, 429 counts and failed slices are reported, not gated" + }, + "written_utc": "2026-10-20T06:10:30Z", + "tool": "scripts/v225_query_hot_read_ab.py", + "tool_commit": "4e87da2ba32ec0dad8722a7e97adfe9665eeebd4", + "concurrent_mode": true, + "tool_sha256": "c34be13752d56cc989da132de835b3a090b138f39a6a6a5e8525091a79faf85e", + "rerun_reason": "P1b alpha DR02/DR03 shapes (coordinator 2026-10-20)", + "alpha_scope": "P1b (coordinator 2026-10-20): DR02/DR03 alpha read shapes, alpha-binance r16 + alpha-okx r15 BAR 1m, same BC rule" +} diff --git a/upgrade/evidence/releases/v2.2.5/query-ab-20261020/foreign.jsonl b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/foreign.jsonl index e01d90ae..624d0be1 100644 --- a/upgrade/evidence/releases/v2.2.5/query-ab-20261020/foreign.jsonl +++ b/upgrade/evidence/releases/v2.2.5/query-ab-20261020/foreign.jsonl @@ -91,3 +91,10 @@ {"utc": "2026-10-20T05:48:48Z", "unix_ms": 1792475328827.3171, "loadavg": "11.73 11.55 10.98 11/2562 2909637", "running_containers": 46, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=1.61 avg60=1.95 avg300=2.37 total=269664682627", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210522057", "psi_io": "some avg10=12.25 avg60=12.04 avg300=12.07 total=346909401399", "lock": null} {"utc": "2026-10-20T05:49:18Z", "unix_ms": 1792475358993.303, "loadavg": "12.55 11.80 11.09 15/2576 2911766", "running_containers": 47, "ours": 6, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1", "ts35-impact-unit"], "psi_cpu": "some avg10=2.74 avg60=2.45 avg300=2.47 total=269665863970", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210522138", "psi_io": "some avg10=11.61 avg60=11.91 avg300=12.04 total=346913117243", "lock": null} {"utc": "2026-10-20T05:49:40Z", "unix_ms": 1792475380007.2566, "loadavg": "12.90 11.94 11.15 14/2400 2913189", "running_containers": 41, "ours": 0, "foreign_test_like": ["live_data_executor", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1", "ts35-impact-unit"], "psi_cpu": "some avg10=1.68 avg60=2.22 avg300=2.41 total=269666336607", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210522212", "psi_io": "some avg10=11.99 avg60=11.94 avg300=12.03 total=346915767763", "lock": null, "phase": "after_cleanup"} +{"utc": "2026-10-20T06:10:30Z", "unix_ms": 1792476630633.013, "loadavg": "10.11 10.14 10.27 12/2667 2991795", "running_containers": 47, "ours": 0, "foreign_test_like": ["control-api-test-node-2977752", "control-api-test-postgres-2977752", "live_data_executor", "p184-dr05-dl-50983f0232604fa7-core", "p184-dr05-dl-50983f0232604fa7-kafka", "p184-dr05-dl-50983f0232604fa7-query", "p184-dr05-dl-50983f0232604fa7-quota", "p184-dr05-dl-50983f0232604fa7-stream", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=11.98 avg60=6.92 avg300=3.79 total=269702895418", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210696390", "psi_io": "some avg10=12.88 avg60=12.48 avg300=12.72 total=347078494128", "lock": null} +{"utc": "2026-10-20T06:11:00Z", "unix_ms": 1792476660770.7092, "loadavg": "11.43 10.45 10.37 4/2945 2996977", "running_containers": 54, "ours": 6, "foreign_test_like": ["control-api-test-node-2977752", "control-api-test-postgres-2977752", "live_data_executor", "p184-dr05-dl-50983f0232604fa7-core", "p184-dr05-dl-50983f0232604fa7-helper", "p184-dr05-dl-50983f0232604fa7-kafka", "p184-dr05-dl-50983f0232604fa7-query", "p184-dr05-dl-50983f0232604fa7-quota", "p184-dr05-dl-50983f0232604fa7-stream", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=17.56 avg60=10.57 avg300=4.98 total=269707833816", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210701925", "psi_io": "some avg10=12.54 avg60=12.58 avg300=12.72 total=347082544586", "lock": null} +{"utc": "2026-10-20T06:11:30Z", "unix_ms": 1792476690888.0312, "loadavg": "12.61 10.82 10.49 7/3044 3001126", "running_containers": 57, "ours": 6, "foreign_test_like": ["control-api-test-node-2977752", "control-api-test-postgres-2977752", "live_data_executor", "p184-dr05-dl-50983f0232604fa7-core", "p184-dr05-dl-50983f0232604fa7-helper", "p184-dr05-dl-50983f0232604fa7-kafka", "p184-dr05-dl-50983f0232604fa7-query", "p184-dr05-dl-50983f0232604fa7-quota", "p184-dr05-dl-50983f0232604fa7-stream", "p184-dr05-pg-05126178", "p184-dr05-redis-05126178", "p184-dr05-writer-05126178", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=10.65 avg60=10.96 avg300=5.65 total=269711469434", "psi_memory": "some avg10=0.06 avg60=0.02 avg300=0.00 total=1210757552", "psi_io": "some avg10=11.67 avg60=12.32 avg300=12.65 total=347086285688", "lock": null} +{"utc": "2026-10-20T06:12:01Z", "unix_ms": 1792476721050.5957, "loadavg": "13.22 11.11 10.59 10/2929 3005028", "running_containers": 54, "ours": 6, "foreign_test_like": ["control-api-test-node-2977752", "control-api-test-postgres-2977752", "live_data_executor", "p184-dr05-dl-50983f0232604fa7-core", "p184-dr05-dl-50983f0232604fa7-helper", "p184-dr05-dl-50983f0232604fa7-kafka", "p184-dr05-dl-50983f0232604fa7-query", "p184-dr05-dl-50983f0232604fa7-quota", "p184-dr05-dl-50983f0232604fa7-stream", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=11.80 avg60=10.48 avg300=6.02 total=269714646054", "psi_memory": "some avg10=0.00 avg60=0.01 avg300=0.00 total=1210789295", "psi_io": "some avg10=12.24 avg60=12.37 avg300=12.63 total=347090189620", "lock": null} +{"utc": "2026-10-20T06:12:31Z", "unix_ms": 1792476751261.0867, "loadavg": "13.21 11.32 10.68 34/3092 3008779", "running_containers": 57, "ours": 6, "foreign_test_like": ["control-api-test-node-2977752", "control-api-test-postgres-2977752", "live_data_executor", "p184-dr05-dl-50983f0232604fa7-core", "p184-dr05-dl-50983f0232604fa7-helper", "p184-dr05-dl-50983f0232604fa7-kafka", "p184-dr05-dl-50983f0232604fa7-query", "p184-dr05-dl-50983f0232604fa7-quota", "p184-dr05-dl-50983f0232604fa7-stream", "p184-dr05-pg-50caf354", "p184-dr05-redis-50caf354", "p184-dr05-writer-50caf354", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=9.28 avg60=10.63 avg300=6.53 total=269718030372", "psi_memory": "some avg10=0.00 avg60=0.00 avg300=0.00 total=1210828746", "psi_io": "some avg10=11.79 avg60=12.18 avg300=12.56 total=347093962599", "lock": null} +{"utc": "2026-10-20T06:13:01Z", "unix_ms": 1792476781454.6055, "loadavg": "12.53 11.36 10.72 25/2907 3013555", "running_containers": 55, "ours": 6, "foreign_test_like": ["live_data_executor", "p184-dr05-dl-50983f0232604fa7-core", "p184-dr05-dl-50983f0232604fa7-helper", "p184-dr05-dl-50983f0232604fa7-kafka", "p184-dr05-dl-50983f0232604fa7-query", "p184-dr05-dl-50983f0232604fa7-quota", "p184-dr05-dl-50983f0232604fa7-stream", "p184-dr05-pg-3a4e7b15", "p184-dr05-redis-3a4e7b15", "p184-dr05-writer-3a4e7b15", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=8.69 avg60=10.23 avg300=6.84 total=269721479772", "psi_memory": "some avg10=0.08 avg60=0.02 avg300=0.00 total=1210876650", "psi_io": "some avg10=13.05 avg60=12.56 avg300=12.62 total=347098072271", "lock": null} +{"utc": "2026-10-20T06:13:09Z", "unix_ms": 1792476789639.1282, "loadavg": "12.22 11.33 10.72 7/2806 3015213", "running_containers": 49, "ours": 0, "foreign_test_like": ["live_data_executor", "p184-dr05-dl-50983f0232604fa7-core", "p184-dr05-dl-50983f0232604fa7-helper", "p184-dr05-dl-50983f0232604fa7-kafka", "p184-dr05-dl-50983f0232604fa7-query", "p184-dr05-dl-50983f0232604fa7-quota", "p184-dr05-dl-50983f0232604fa7-stream", "p184-dr05-pg-3a4e7b15", "p184-dr05-redis-3a4e7b15", "p184-dr05-writer-3a4e7b15", "redis_marketdata", "redis_service", "trading-system-manager-read-live-portal_manager_issuer-1", "trading-system-manager-read-live-portal_manager_read-1", "trading-system-manager-read-sandbox-portal_manager_issuer-1", "trading-system-manager-read-sandbox-portal_manager_read-1"], "psi_cpu": "some avg10=9.52 avg60=10.47 avg300=7.02 total=269722200283", "psi_memory": "some avg10=0.02 avg60=0.02 avg300=0.00 total=1210894533", "psi_io": "some avg10=12.81 avg60=12.54 avg300=12.61 total=347099146708", "lock": null, "phase": "after_cleanup"}