Add OK note when PKL and CPL annotation texts match.
authorCarl Hetherington <cth@carlh.net>
Sun, 7 Jan 2024 23:40:25 +0000 (00:40 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 15 Apr 2024 08:59:34 +0000 (10:59 +0200)
src/verify.cc
src/verify.h
test/verify_test.cc

index 0dd8f75e8c10af74e00c4b4d5808f0e9b4eb0aa6..17b751e6ed79526af7319cd73384e16aff80b7cd 100644 (file)
@@ -1643,6 +1643,8 @@ verify_cpl(Context& context, shared_ptr<const CPL> cpl)
 
                if (required_annotation_text && i->annotation_text() != required_annotation_text) {
                        context.bv21_error(VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, i->id(), i->file().get());
+               } else {
+                       context.ok(VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL);
                }
        }
 
@@ -2089,6 +2091,8 @@ dcp::note_to_string (VerificationNote note)
                return String::compose("The PKL %1, which has encrypted content, is not signed.", note.note().get());
        case VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL:
                return String::compose("The PKL %1 has only one CPL but its <AnnotationText> does not match the CPL's <ContentTitleText>.", note.note().get());
+       case VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL:
+               return "The PKL and CPL annotation texts match.";
        case VerificationNote::Code::ALL_ENCRYPTED:
                return "All the assets are encrypted.";
        case VerificationNote::Code::NONE_ENCRYPTED:
index 70cdff3de9dda0f3f798d0e4e8dcedeb0664126d..df515d19a8d7e86ceac84d616da5738b26f6fd77 100644 (file)
@@ -343,6 +343,7 @@ public:
                 *  file contains the PKL filename
                 */
                MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL,
+               MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL,
                /** All content is encrypted */
                ALL_ENCRYPTED,
                /** No content is encrypted */
index cc2301d9fc7aea218aa27b8447d4c0e9aab715a3..12cc953b7b04aace5ecaf098e15b9b77a3e4ea14 100644 (file)
@@ -470,6 +470,7 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_picture_sound_hash)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -507,6 +508,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_picture_sound_hashes)
                { dir },
                {},
                {
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -550,6 +552,7 @@ BOOST_AUTO_TEST_CASE (verify_failed_read_content_kind)
                {},
                {
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -613,6 +616,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_picture_frame_rate)
                                string{"1998x1080"},
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
@@ -638,6 +642,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_asset)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -670,6 +675,7 @@ BOOST_AUTO_TEST_CASE (verify_empty_asset_path)
                                string{"1998x1080"},
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_ASSET_PATH }
                };
@@ -698,6 +704,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_standard)
                                string{"1998x1080"},
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_STANDARD },
                        dcp::VerificationNote(
@@ -750,6 +757,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_id)
                                string{"1998x1080"},
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
@@ -783,6 +791,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_issue_date)
                                string{"1998x1080"},
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(cpl_path)
@@ -819,6 +828,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_pkl_id)
                                string{"1998x1080"},
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
@@ -854,6 +864,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_asset_map_id)
                                string{"1998x1080"},
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
@@ -921,6 +932,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_standard)
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf"), cpl),
                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "j2c_c6035f97-b07d-4e1c-944d-603fc2ddc242.mxf"), cpl)
        };
@@ -948,6 +960,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_duration)
 
        vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "j2c_d7576dcb-a361-4139-96b8-267f5f8d7f91.mxf"), cpl),
                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "j2c_d7576dcb-a361-4139-96b8-267f5f8d7f91.mxf"), cpl),
@@ -1020,6 +1033,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_picture_frame_size_in_bytes)
 
        vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl),
@@ -1072,6 +1086,7 @@ BOOST_AUTO_TEST_CASE (verify_nearly_invalid_picture_frame_size_in_bytes)
        vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
        };
@@ -1119,6 +1134,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_picture_frame_size_in_bytes)
                {
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "pic.mxf"), cpl),
@@ -1141,6 +1157,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_interop_subtitles)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                        dcp::VerificationNote(
@@ -1164,6 +1181,7 @@ BOOST_AUTO_TEST_CASE(verify_catch_missing_font_file_with_interop_ccap)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                        dcp::VerificationNote(
@@ -1194,6 +1212,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_interop_subtitles)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                        dcp::VerificationNote(
@@ -1227,6 +1246,7 @@ BOOST_AUTO_TEST_CASE(verify_interop_subtitle_asset_with_no_subtitles)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                        dcp::VerificationNote(
@@ -1254,6 +1274,7 @@ BOOST_AUTO_TEST_CASE(verify_interop_subtitle_asset_with_single_space_subtitle)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                        dcp::VerificationNote(
@@ -1278,6 +1299,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_smpte_subtitles)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        dcp::VerificationNote(
@@ -1310,6 +1332,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_smpte_subtitles)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        dcp::VerificationNote(
@@ -1352,6 +1375,7 @@ BOOST_AUTO_TEST_CASE (verify_empty_text_node_in_subtitles)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        dcp::VerificationNote(
@@ -1391,6 +1415,7 @@ BOOST_AUTO_TEST_CASE (verify_empty_text_node_in_subtitles_with_child_nodes)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                        dcp::VerificationNote(
@@ -1415,6 +1440,7 @@ BOOST_AUTO_TEST_CASE (verify_empty_text_node_in_subtitles_with_empty_child_nodes
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_SUBTITLE, asset->id(), boost::filesystem::canonical(asset->file().get())
@@ -1454,6 +1480,7 @@ BOOST_AUTO_TEST_CASE (verify_external_asset)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EXTERNAL_ASSET, picture->asset()->id() },
@@ -1531,6 +1558,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_cpl_metadata_bad_tag)
                {},
                {
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "pic.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -1614,6 +1642,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language1)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        dcp::VerificationNote(
@@ -1647,6 +1676,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language2)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        dcp::VerificationNote(
@@ -1700,6 +1730,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_language3)
                {
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "videofoo.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -1793,6 +1824,7 @@ check_picture_size_ok (int width, int height, int frame_rate, bool three_d)
        std::vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                dcp::VerificationNote(
                        dcp::VerificationNote::Type::OK,
@@ -1819,6 +1851,7 @@ check_picture_size_bad_frame_size (int width, int height, int frame_rate, bool t
        std::vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                dcp::VerificationNote(
                        dcp::VerificationNote::Type::OK,
@@ -1848,6 +1881,7 @@ check_picture_size_bad_2k_frame_rate (int width, int height, int frame_rate, boo
        std::vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                dcp::VerificationNote(
                        dcp::VerificationNote::Type::OK,
@@ -1881,6 +1915,7 @@ check_picture_size_bad_4k_frame_rate (int width, int height, int frame_rate, boo
        std::vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                dcp::VerificationNote(
                        dcp::VerificationNote::Type::OK,
@@ -1949,6 +1984,7 @@ BOOST_AUTO_TEST_CASE (verify_picture_size)
        std::vector<dcp::VerificationNote> expected = {
                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                dcp::VerificationNote(
                        dcp::VerificationNote::Type::OK,
@@ -2016,6 +2052,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_xml_size_in_bytes)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        dcp::VerificationNote(
@@ -2070,6 +2107,7 @@ verify_timed_text_asset_too_large (string name)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        dcp::VerificationNote(
@@ -2145,6 +2183,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_language)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -2201,6 +2240,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_languages)
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video0.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video1.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -2258,6 +2298,7 @@ BOOST_AUTO_TEST_CASE (verify_multiple_closed_caption_languages_allowed)
                {},
                {
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -2325,6 +2366,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_start_time)
                {
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -2391,6 +2433,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_start_time)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -2500,6 +2543,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_first_text_time)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME
                                ).set_cpl_id(cpl->id()),
@@ -2523,6 +2567,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_first_text_time)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -2578,6 +2623,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_first_text_time_on_second_reel)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -2601,6 +2647,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_spacing)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING
                                ).set_cpl_id(cpl->id()),
@@ -2628,6 +2675,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_spacing)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -2646,6 +2694,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_duration)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION
                                ).set_cpl_id(cpl->id()),
@@ -2668,6 +2717,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_duration)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -2695,6 +2745,7 @@ BOOST_AUTO_TEST_CASE (verify_subtitle_overlapping_reel_boundary)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "72 96", boost::filesystem::canonical(asset->file().get())
                                ).set_cpl_id(cpl->id()),
@@ -2730,6 +2781,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_count1)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_COUNT
                                ).set_cpl_id(cpl->id()),
@@ -2758,6 +2810,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_line_count1)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -2783,6 +2836,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_count2)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_COUNT
                                ).set_cpl_id(cpl->id()),
@@ -2812,6 +2866,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_subtitle_line_count2)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -2834,6 +2889,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_length1)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::NEARLY_INVALID_SUBTITLE_LINE_LENGTH
                                ).set_cpl_id(cpl->id()),
@@ -2859,6 +2915,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_line_length2)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::INVALID_SUBTITLE_LINE_LENGTH
                                ).set_cpl_id(cpl->id()),
@@ -2887,6 +2944,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_count1)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_COUNT
                                ).set_cpl_id(cpl->id()),
@@ -2915,6 +2973,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_count2)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -2940,6 +2999,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_line_count3)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_COUNT
                                ).set_cpl_id(cpl->id()),
@@ -2969,6 +3029,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_count4)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -2992,6 +3053,7 @@ BOOST_AUTO_TEST_CASE (verify_valid_closed_caption_line_length)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -3014,6 +3076,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_closed_caption_line_length)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_CLOSED_CAPTION_LINE_LENGTH
                                ).set_cpl_id(cpl->id()),
@@ -3041,6 +3104,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_valign1)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -3065,6 +3129,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_valign2)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CLOSED_CAPTION_VALIGN
                                ).set_cpl_id(cpl->id()),
@@ -3093,6 +3158,7 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering1)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -3118,6 +3184,7 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering2)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -3136,6 +3203,7 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering3)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INCORRECT_CLOSED_CAPTION_ORDERING
                                ).set_cpl_id(cpl->id()),
@@ -3158,6 +3226,7 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_closed_caption_ordering4)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                ).set_cpl_id(cpl->id())
@@ -3191,6 +3260,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_sound_frame_rate)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "videofoo.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -3236,6 +3306,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_cpl_annotation_text)
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_ANNOTATION_TEXT, canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
@@ -3268,6 +3339,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_cpl_annotation_text)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        dcp::VerificationNote(
@@ -3314,6 +3386,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_asset_duration)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -3395,6 +3468,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_main_subtitle_from_some_reels)
                        {
                                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+                               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -3419,6 +3493,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_main_subtitle_from_some_reels)
                        {
                                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+                               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -3439,6 +3514,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_main_subtitle_from_some_reels)
                        {
                                ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+                               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video1.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video2.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
@@ -3523,6 +3599,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_asset_counts)
                                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+                               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                                dcp::VerificationNote(
                                        dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_CLOSED_CAPTION_ASSET_COUNTS
                                        ).set_cpl_id(cpl->id()),
@@ -3546,6 +3623,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_asset_counts)
                                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl),
+                               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                                dcp::VerificationNote(
                                        dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                        ).set_cpl_id(cpl->id())
@@ -3566,6 +3644,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_closed_caption_asset_counts)
                                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video1.mxf"), cpl),
                                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video2.mxf"), cpl),
+                               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                                dcp::VerificationNote(
                                        dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA, cpl->file().get()
                                        ).set_cpl_id(cpl->id())
@@ -3615,6 +3694,7 @@ verify_text_entry_point_check (path dir, dcp::VerificationNote::Code code, boost
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
@@ -3699,6 +3779,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_hash)
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl->file().get()
                                ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
@@ -3733,6 +3814,7 @@ verify_markers_test (
 
        test_notes.push_back(ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl));
        test_notes.push_back(ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl));
+       test_notes.push_back(ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl));
        test_notes.push_back(ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl));
        test_notes.push_back(
                dcp::VerificationNote(
@@ -3846,6 +3928,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_cpl_metadata_version_number)
                {
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -3883,6 +3966,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_extension_metadata1)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -3922,6 +4006,7 @@ BOOST_AUTO_TEST_CASE (verify_missing_extension_metadata2)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -3962,6 +4047,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata3)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -4003,6 +4089,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_extension_metadata1)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -4042,6 +4129,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_extension_metadata2)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -4082,6 +4170,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata6)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -4124,6 +4213,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata7)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -4164,6 +4254,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata8)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -4206,6 +4297,7 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata9)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -4357,6 +4449,7 @@ BOOST_AUTO_TEST_CASE (verify_unsigned_pkl_with_unencrypted_content)
                {
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -4439,6 +4532,7 @@ BOOST_AUTO_TEST_CASE (verify_partially_encrypted)
                                string{"1440x1080"},
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -4547,6 +4641,7 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_resource_id)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "240 0", boost::filesystem::canonical(subs_mxf)
@@ -4624,6 +4719,7 @@ BOOST_AUTO_TEST_CASE (verify_incorrect_timed_text_id)
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_TIMED_TEXT_DURATION , "240 0", boost::filesystem::canonical(subs_mxf)
@@ -4659,6 +4755,7 @@ BOOST_AUTO_TEST_CASE (verify_threed_marked_as_twod)
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "0d6f57e6-adac-4e1d-bfbe-d162bf13e2cd_j2c.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(path / "0d6f57e6-adac-4e1d-bfbe-d162bf13e2cd_j2c.mxf"), cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::WARNING,
@@ -4706,6 +4803,7 @@ BOOST_AUTO_TEST_CASE (verify_unexpected_things_in_main_markers)
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, canonical(find_cpl(dir))
                                ).set_cpl_id(cpl->id()).set_reference_hash(calc.old_hash()).set_calculated_hash(calc.new_hash()),
@@ -4746,6 +4844,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_content_kind)
                                string{"1998x1080"},
                                canonical(cpl->file().get())
                                ).set_cpl_id(cpl->id()),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
@@ -4781,6 +4880,7 @@ BOOST_AUTO_TEST_CASE(verify_valid_content_kind)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
@@ -4823,6 +4923,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_picture_active_area_1)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
@@ -4865,6 +4966,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_picture_active_area_2)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
                        ok(dcp::VerificationNote::Code::VALID_PICTURE_FRAME_SIZES_IN_BYTES, canonical(dir / "video.mxf"), cpl),
@@ -4905,6 +5007,7 @@ BOOST_AUTO_TEST_CASE(verify_duplicate_pkl_asset_ids)
                { dir },
                {},
                {
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -4941,6 +5044,7 @@ BOOST_AUTO_TEST_CASE(verify_duplicate_assetmap_asset_ids)
                { dir },
                {},
                {
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -5029,6 +5133,7 @@ BOOST_AUTO_TEST_CASE(verify_mismatched_sound_channel_counts)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -5095,6 +5200,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_sound_configuration)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video1.mxf"), cpl),
@@ -5171,6 +5277,7 @@ BOOST_AUTO_TEST_CASE(verify_invalid_tile_part_size)
                        cpl->file().get()
                        ).set_cpl_id(cpl->id()),
                ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(path / "video.mxf"), cpl),
+               ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                dcp::VerificationNote(
@@ -5222,6 +5329,7 @@ BOOST_AUTO_TEST_CASE(verify_too_many_subtitle_namespaces)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"Dcp_FTR-1_F_XX-XX_MOS_2K_20230407_SMPTE_OV"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "j2c_42b34dcd-caa5-4c7b-aa0f-66a590947ba1.mxf"), cpl),
@@ -5266,6 +5374,7 @@ BOOST_AUTO_TEST_CASE(verify_missing_load_font_for_font)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
                        dcp::VerificationNote(dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_LOAD_FONT_FOR_FONT).set_id("theFontId").set_cpl_id(cpl->id())
@@ -5318,6 +5427,7 @@ BOOST_AUTO_TEST_CASE(verify_missing_load_font)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -5356,6 +5466,7 @@ BOOST_AUTO_TEST_CASE(verify_spots_wrong_asset)
                {},
                {
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        dcp::VerificationNote(
                                dcp::VerificationNote::Type::OK,
@@ -5391,6 +5502,7 @@ BOOST_AUTO_TEST_CASE(verify_cpl_content_version_label_text_empty)
                                cpl->file().get()
                                ).set_cpl_id(cpl->id()),
                        ok(dcp::VerificationNote::Code::NONE_ENCRYPTED, cpl),
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"A Test DCP"}, cpl),
                        ok(dcp::VerificationNote::Code::CORRECT_PICTURE_HASH, canonical(dir / "video.mxf"), cpl),
@@ -5418,6 +5530,7 @@ BOOST_AUTO_TEST_CASE(verify_encrypted_smpte_dcp)
                { dir },
                { kdm },
                {
+                       ok(dcp::VerificationNote::Code::MATCHING_PKL_ANNOTATION_TEXT_WITH_CPL, cpl),
                        ok(dcp::VerificationNote::Code::MATCHING_CPL_HASHES, cpl),
                        ok(dcp::VerificationNote::Code::VALID_CPL_ANNOTATION_TEXT, string{"hello"}, cpl),
                        ok(dcp::VerificationNote::Code::ALL_ENCRYPTED, cpl),