Skip to content

Commit b082a86

Browse files
Pigbibicodex
andcommitted
Reuse validated legacy snapshot for upload
Co-Authored-By: Codex <noreply@openai.com>
1 parent 3c45968 commit b082a86

2 files changed

Lines changed: 85 additions & 3 deletions

File tree

src/publish.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,8 @@ def upload_release_artifacts(
434434
settings: PublishSettings,
435435
artifacts: ReleaseArtifacts,
436436
storage_layout: dict[str, Any],
437+
*,
438+
live_pool_legacy_exact_bytes: bytes,
437439
) -> None:
438440
if settings.dry_run:
439441
return
@@ -462,9 +464,14 @@ def upload_release_artifacts(
462464
files[opt_file] = opt_path
463465
for filename, local_path in files.items():
464466
object_info = storage_layout["objects"][filename]
465-
store.write_bytes(object_info["release_uri"], local_path.read_bytes())
467+
upload_bytes = (
468+
live_pool_legacy_exact_bytes
469+
if filename == "live_pool_legacy.json"
470+
else local_path.read_bytes()
471+
)
472+
store.write_bytes(object_info["release_uri"], upload_bytes)
466473
if settings.upload_current_pointer:
467-
store.write_bytes(object_info["current_uri"], local_path.read_bytes())
474+
store.write_bytes(object_info["current_uri"], upload_bytes)
468475

469476

470477
def publish_firestore_summary(settings: PublishSettings, firestore_payload: dict[str, Any]) -> None:
@@ -514,6 +521,9 @@ def run_release_publish(
514521
artifacts = load_release_artifacts(config["paths"].output_dir, settings.mode)
515522
storage_layout = build_storage_layout(settings, artifacts)
516523
firestore_payload = build_firestore_payload(settings, artifacts, storage_layout)
524+
live_pool_legacy_exact_bytes = firestore_payload["live_pool_legacy_exact_bytes"][
525+
"utf8_text"
526+
].encode("utf-8")
517527
manifest = build_release_manifest(settings, artifacts, storage_layout, firestore_payload)
518528
manifest_path = write_release_manifest(artifacts.output_dir, manifest)
519529
validation = assert_release_outputs(
@@ -533,8 +543,18 @@ def run_release_publish(
533543
or firestore_payload.get("runtime_evidence_identity") != artifacts.runtime_evidence_identity
534544
):
535545
raise ValueError("Runtime evidence identity changed before publish.")
546+
if (
547+
live_pool_legacy_exact_bytes
548+
!= artifacts.live_pool_legacy_path.read_bytes()
549+
):
550+
raise ValueError("Validated live_pool_legacy.json exact bytes changed before publish.")
536551

537-
upload_release_artifacts(settings, artifacts, storage_layout)
552+
upload_release_artifacts(
553+
settings,
554+
artifacts,
555+
storage_layout,
556+
live_pool_legacy_exact_bytes=live_pool_legacy_exact_bytes,
557+
)
538558
publish_firestore_summary(settings, firestore_payload)
539559

540560
return {

tests/test_release_contract.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import tempfile
66
import unittest
77
from pathlib import Path
8+
from unittest.mock import patch
89

910
import pandas as pd
1011

@@ -16,6 +17,7 @@
1617
build_storage_layout,
1718
ensure_publish_preflight,
1819
load_release_artifacts,
20+
upload_release_artifacts,
1921
)
2022
from src.release_contract import validate_release_outputs
2123

@@ -302,6 +304,66 @@ def test_firestore_payload_preserves_exact_legacy_artifact_bytes(self) -> None:
302304
self.assertEqual(handoff["encoding"], "utf-8")
303305
self.assertEqual(handoff["utf8_text"].encode("utf-8"), exact_bytes)
304306

307+
def test_upload_reuses_validated_legacy_snapshot_after_path_mutation(self) -> None:
308+
with tempfile.TemporaryDirectory() as tmp_dir:
309+
root = Path(tmp_dir)
310+
output_dir = self.build_runtime_identity_outputs(root)
311+
artifacts = load_release_artifacts(output_dir, "core_major")
312+
settings = PublishSettings(
313+
enabled=True,
314+
dry_run=False,
315+
mode="core_major",
316+
project_id="test-project",
317+
cloud_bucket="test-bucket",
318+
cloud_root_prefix="crypto-live-pool-pipelines",
319+
firestore_collection="strategy",
320+
firestore_document="CRYPTO_LIVE_POOL_ROTATION_LIVE_POOL",
321+
source_project="crypto-live-pool-pipelines",
322+
upload_current_pointer=True,
323+
)
324+
storage_layout = build_storage_layout(settings, artifacts)
325+
firestore_payload = build_firestore_payload(
326+
settings,
327+
artifacts,
328+
storage_layout,
329+
)
330+
validated_bytes = firestore_payload["live_pool_legacy_exact_bytes"][
331+
"utf8_text"
332+
].encode("utf-8")
333+
artifacts.live_pool_legacy_path.write_bytes(b'{"mutated": true}\n')
334+
335+
uploaded: dict[str, bytes] = {}
336+
337+
class FakeStore:
338+
def write_bytes(self, uri: str, payload: bytes) -> None:
339+
uploaded[uri] = payload
340+
341+
with patch(
342+
"quant_platform_kit.cloud.get_object_store",
343+
return_value=FakeStore(),
344+
):
345+
upload_release_artifacts(
346+
settings,
347+
artifacts,
348+
storage_layout,
349+
live_pool_legacy_exact_bytes=validated_bytes,
350+
)
351+
352+
legacy_objects = storage_layout["objects"]["live_pool_legacy.json"]
353+
release_bytes = uploaded[legacy_objects["release_uri"]]
354+
current_bytes = uploaded[legacy_objects["current_uri"]]
355+
manifest_digest = artifacts.artifact_manifest["artifacts"][
356+
"live_pool_legacy"
357+
]["sha256"]
358+
identity_digest = artifacts.runtime_evidence_identity["artifacts"][
359+
"live_pool_legacy"
360+
]["sha256"]
361+
self.assertEqual(release_bytes, validated_bytes)
362+
self.assertEqual(current_bytes, validated_bytes)
363+
self.assertEqual(hashlib.sha256(validated_bytes).hexdigest(), manifest_digest)
364+
self.assertEqual(hashlib.sha256(release_bytes).hexdigest(), manifest_digest)
365+
self.assertEqual(identity_digest, manifest_digest)
366+
305367
def test_firestore_payload_rejects_mutated_legacy_bytes_with_unchanged_identity(self) -> None:
306368
with tempfile.TemporaryDirectory() as tmp_dir:
307369
root = Path(tmp_dir)

0 commit comments

Comments
 (0)