@@ -480,3 +480,38 @@ def test_unknown_top_level_keys_ignored(tmp_path: Path) -> None:
480480 _write (receipt , payload )
481481 result = _run (receipt , lock )
482482 assert result .returncode == EXIT_VALID , result .stderr
483+
484+
485+ # --- Fix round 2 (R30): lock lane names must be UTF-8-encodable.
486+ #
487+ # Without this, an unencodable lock lane matching an unencodable receipt
488+ # lane passes the roster (rule 5) and lane entries (rule 6) while the
489+ # bundle check (rule 7) skips -> exit 0 with a bogus bundle.
490+
491+
492+ def test_unencodable_lock_lane_name_rejects_lock (tmp_path : Path ) -> None :
493+ lane = f"{ chr (0xD800 )} lane"
494+ bad_lock = make_lock ()
495+ bad_lock ["tiers" ]["pr-smoke" ]["lanes" ] = [lane ]
496+ lock = _write (tmp_path / "lock.json" , bad_lock )
497+ payload = make_receipt ()
498+ payload ["lanes" ] = {lane : {"verdict" : "pass" , "admitted" : True , "evidence_digest" : _hex64 ("e" )}}
499+ payload ["bundle_identity" ] = "0" * 64
500+ receipt = _write (tmp_path / "receipt.json" , payload )
501+ result = _run (receipt , lock )
502+ assert result .returncode == EXIT_USAGE , result .stderr
503+ assert "tiers.pr-smoke.lanes" in result .stderr
504+
505+
506+ def test_checked_in_lock_accepts_valid_receipt (tmp_path : Path ) -> None :
507+ # Control: the committed initial lock plus a matching valid receipt
508+ # still verifies (guards R30 false-positives on normal lane names).
509+ lock = REPO_ROOT / ".github" / "provider-round.lock.json"
510+ lock_payload = json .loads (lock .read_text (encoding = "utf-8" ))
511+ payload = make_receipt ()
512+ payload ["p11lab_sha" ] = lock_payload ["p11lab_ref" ]
513+ payload ["evaluator_sha" ] = lock_payload ["evaluator_fw_ref" ]
514+ payload ["baseline_fw_sha" ] = lock_payload ["baseline_fw_sha" ]
515+ receipt = _write (tmp_path / "receipt.json" , payload )
516+ result = _run (receipt , lock )
517+ assert result .returncode == EXIT_VALID , result .stderr
0 commit comments