@@ -118,6 +118,31 @@ def test_blocks_default_parameters_added_to_headers(self):
118118
119119 self .assert_blocked_by (result , "No new default parameters" )
120120
121+ def test_ignores_crlf_to_lf_only_changes_for_semantic_added_lines (self ):
122+ self .write ("source/source_base/defaults.h" , b"void update_solver(int step = 0);\r \n " , mode = "wb" )
123+ self .git ("add" , "." )
124+ self .git ("commit" , "-m" , "add crlf header" )
125+ base = self .git ("rev-parse" , "HEAD" ).stdout .strip ()
126+ self .write ("source/source_base/defaults.h" , "void update_solver(int step = 0);\n " )
127+ head = self .commit_change ()
128+
129+ result = self .run_checker ("--base" , base , "--head" , head )
130+
131+ self .assertEqual (result .returncode , 0 , result .stdout + result .stderr )
132+ self .assertNotIn ("No new default parameters" , result .stdout )
133+
134+ def test_staged_mode_ignores_crlf_to_lf_only_semantic_added_lines (self ):
135+ self .write ("source/source_base/defaults.h" , b"void update_solver(int step = 0);\r \n " , mode = "wb" )
136+ self .git ("add" , "." )
137+ self .git ("commit" , "-m" , "add crlf header" )
138+ self .write ("source/source_base/defaults.h" , "void update_solver(int step = 0);\n " )
139+ self .git ("add" , "." )
140+
141+ result = self .run_checker ("--staged" )
142+
143+ self .assertEqual (result .returncode , 0 , result .stdout + result .stderr )
144+ self .assertNotIn ("No new default parameters" , result .stdout )
145+
121146 def test_allows_for_loop_initializer_in_header (self ):
122147 self .write (
123148 "source/source_base/loop_header.h" ,
@@ -232,6 +257,33 @@ def test_blocks_unfilled_pr_template_fields_from_event_payload(self):
232257
233258 self .assert_blocked_by (result , "PR metadata completeness" )
234259
260+ def test_blocks_empty_pr_template_from_event_payload (self ):
261+ for body in ("" , None ):
262+ with self .subTest (body = body ):
263+ event = self .repo / "event.json"
264+ event .write_text (json .dumps ({"pull_request" : {"body" : body }}))
265+
266+ result = self .run_checker ("--event-path" , str (event ))
267+
268+ self .assert_blocked_by (result , "PR metadata completeness" )
269+
270+ def test_blocks_missing_pr_body_from_event_payload (self ):
271+ event = self .repo / "event.json"
272+ event .write_text (json .dumps ({"pull_request" : {}}))
273+
274+ result = self .run_checker ("--event-path" , str (event ))
275+
276+ self .assert_blocked_by (result , "PR metadata completeness" )
277+
278+ def test_skips_pr_metadata_when_event_payload_is_not_a_pull_request (self ):
279+ event = self .repo / "event.json"
280+ event .write_text (json .dumps ({"workflow_run" : {"name" : "Agent Governance" }}))
281+
282+ result = self .run_checker ("--event-path" , str (event ))
283+
284+ self .assertEqual (result .returncode , 0 , result .stdout + result .stderr )
285+ self .assertNotIn ("PR metadata completeness" , result .stdout )
286+
235287 def test_accepts_filled_pr_template_fields_from_event_payload (self ):
236288 event = self .repo / "event.json"
237289 event .write_text (
@@ -469,6 +521,26 @@ def test_warns_for_new_header_include(self):
469521
470522 self .assert_warns_with_success (result , "Header dependency review" )
471523
524+ def test_merge_base_scoped_comparison_excludes_base_branch_only_changes (self ):
525+ self .write ("source/source_base/api.h" , "void update_solver(int step = 0);\n " )
526+ self .git ("add" , "." )
527+ self .git ("commit" , "-m" , "add legacy default" )
528+ base_branch = self .git ("branch" , "--show-current" ).stdout .strip ()
529+ merge_base = self .git ("rev-parse" , "HEAD" ).stdout .strip ()
530+ self .git ("checkout" , "-b" , "feature" )
531+ self .write ("docs/feature.md" , "feature docs\n " )
532+ head = self .commit_change ()
533+ self .git ("checkout" , base_branch )
534+ self .write ("source/source_base/api.h" , "void update_solver(int step);\n " )
535+ base_tip = self .commit_change ()
536+
537+ base_tip_result = self .run_checker ("--base" , base_tip , "--head" , head )
538+ merge_base_result = self .run_checker ("--base" , merge_base , "--head" , head )
539+
540+ self .assertIn ("No new default parameters" , base_tip_result .stdout )
541+ self .assertNotIn ("No new default parameters" , merge_base_result .stdout )
542+ self .assertEqual (merge_base_result .returncode , 0 , merge_base_result .stdout + merge_base_result .stderr )
543+
472544 def test_blocks_new_heterogeneous_file_without_cmake_linkage (self ):
473545 self .write ("source/module_hamilt/kernels/new_kernel.cu" , "__global__ void k() {}\n " )
474546 head = self .commit_change ()
0 commit comments