Skip to content

Commit 56b5769

Browse files
Pigbibicodex
andcommitted
fix: enforce optional identity suffix class
Co-Authored-By: Codex <noreply@openai.com>
1 parent e379d76 commit 56b5769

2 files changed

Lines changed: 33 additions & 1 deletion

File tree

src/quant_advisor_research/identity_lifecycle.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,12 @@ def _validate_v2_entry(entry: object) -> V2IdentityBinding:
174174
expected_html = f"{as_of}-{cadence}-model-recommendations.html"
175175
if html_name != expected_html and html_digest is None:
176176
raise _error("identity_name_mismatch")
177-
if any(digest != json_digest for digest in (html_digest, md_digest, manifest_digest) if digest is not None):
177+
declared_digests = [html_digest]
178+
if md_name is not None:
179+
declared_digests.append(md_digest)
180+
if manifest_name is not None:
181+
declared_digests.append(manifest_digest)
182+
if any(digest != json_digest for digest in declared_digests):
178183
raise _error("identity_name_mismatch")
179184
if json_digest is None:
180185
if canonical_identity is not True:

tests/test_identity_lifecycle.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,33 @@ def test_v2_optional_attachments_can_be_declared_independently(optional_fields:
165165
assert len(parse_v2_index({"schema_version": 2, "reports": [v2_entry(), entry]}).bindings) == 2
166166

167167

168+
@pytest.mark.parametrize("field", ["md", "manifest"])
169+
def test_variant_declared_unsuffixed_optional_attachment_is_rejected(field: str) -> None:
170+
entry = v2_entry(variant=True, digest=DIGEST_B)
171+
entry[field] = entry[field].replace(f".variant-{DIGEST_B}", "")
172+
173+
with pytest.raises(IdentityMetadataError, match="identity_name_mismatch"):
174+
parse_v2_index({"schema_version": 2, "reports": [v2_entry(), entry]})
175+
176+
177+
@pytest.mark.parametrize("field", ["md", "manifest"])
178+
def test_variant_declared_wrong_digest_optional_attachment_is_rejected(field: str) -> None:
179+
entry = v2_entry(variant=True, digest=DIGEST_B)
180+
entry[field] = entry[field].replace(DIGEST_B, DIGEST_A)
181+
182+
with pytest.raises(IdentityMetadataError, match="identity_name_mismatch"):
183+
parse_v2_index({"schema_version": 2, "reports": [v2_entry(), entry]})
184+
185+
186+
@pytest.mark.parametrize("field", ["md", "manifest"])
187+
def test_canonical_declared_suffixed_optional_attachment_is_rejected(field: str) -> None:
188+
entry = v2_entry()
189+
entry[field] = entry[field].replace(".md" if field == "md" else ".json.manifest.json", ".variant-" + DIGEST_A + (".md" if field == "md" else ".json.manifest.json"))
190+
191+
with pytest.raises(IdentityMetadataError, match="identity_name_mismatch"):
192+
parse_v2_index({"schema_version": 2, "reports": [entry]})
193+
194+
168195
def test_v2_duplicate_identity_rejects_any_metadata_or_digest_difference() -> None:
169196
first = v2_entry()
170197
duplicate = dict(first)

0 commit comments

Comments
 (0)