Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/1024.added
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Added a Stage 5 release candidate validation service backed by the shared validation core.
13 changes: 13 additions & 0 deletions docs/engineering/stages/release_promotion.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,19 @@ or step manifests. Release-specific details such as missing staged artifacts,
missing validation reports, finalized-release conflicts, version mismatches, or
destination conflicts should live in canonical finding metadata.

Use `ReleaseCandidateValidator` for the `5a_validate_outputs` library seam.
It wraps `policyengine_us_data.validation_core` and calls existing release
guards through injected dependencies, including staged-artifact presence,
release-manifest preflight, matching finalized-manifest checks, and release
completion marker checks. It should require all base dataset artifacts plus the
regional/national H5 artifact families. By default, canonical
`validation_report.json` files must parse as shared `ValidationReport` payloads
with release-acceptable statuses. Manual overrides may set the validator's
`validation_report_policy` to `presence_only`, but that override only relaxes
report parsing/status checks; report files must still exist. Keep dependencies
injectable so unit tests do not need Hugging Face, GCS, Modal, or production
credentials.

## Rerun Comparison Material

Before public writes, rerun and reuse decisions should compare semantic
Expand Down
16 changes: 16 additions & 0 deletions policyengine_us_data/release_promotion/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,31 @@
read_stage4_release_candidate_bundle,
)
from .validation import build_release_candidate_shape_report
from .validation import (
DEFAULT_REQUIRED_RELEASE_ARTIFACT_FAMILIES,
RELEASE_VALIDATION_SUBSTAGE_ID,
ReleaseCandidateValidationDependencies,
ReleaseCandidateValidator,
VALIDATION_REPORT_POLICY_PRESENCE_ONLY,
VALIDATION_REPORT_POLICY_REQUIRE_PASSING,
default_release_candidate_validation_dependencies,
)

__all__ = [
"BASE_RELEASE_ARTIFACT_PATHS",
"DEFAULT_REQUIRED_RELEASE_ARTIFACT_FAMILIES",
"RELEASE_VALIDATION_SUBSTAGE_ID",
"ReleaseArtifactSpec",
"ReleaseCandidateInputBundle",
"ReleasePromotionContext",
"ReleaseCandidateValidationDependencies",
"ReleaseCandidateValidator",
"VALIDATION_REPORT_POLICY_PRESENCE_ONLY",
"VALIDATION_REPORT_POLICY_REQUIRE_PASSING",
"build_legacy_release_candidate_bundle",
"build_release_candidate_bundle_from_stage4_contract",
"build_release_candidate_shape_report",
"default_release_candidate_validation_dependencies",
"dedupe_normalized_release_paths",
"infer_artifact_identity",
"infer_release_artifact_spec",
Expand Down
Loading