@@ -253,16 +253,17 @@ void snippetFoundInContent_shouldBeConfirmed() {
253253 }
254254
255255 @ Test
256- void snippetGone_shouldBeResolved () {
256+ void snippetGone_shouldBeRoutedToAi () {
257257 String content = "alpha\n gamma\n delta" ;
258258 var hashes = LineHashSequence .from (content );
259- // Snippet "beta" at line 2 — but "beta" no longer exists
259+ // Snippet "beta" at line 2 — but "beta" no longer exists.
260+ // Should route to AI for verification, not auto-resolve.
260261 var results = engine .classifyByContent (
261262 List .of (issue (2 , "beta" )),
262263 hashes );
263264 assertThat (results ).hasSize (1 );
264265 assertThat (results .get (0 ).classification ())
265- .isEqualTo (IssueReconciliationEngine .Classification .RESOLVED );
266+ .isEqualTo (IssueReconciliationEngine .Classification .NEEDS_AI );
266267 }
267268
268269 @ Test
@@ -279,16 +280,18 @@ void lineHashFoundButNoSnippet_shouldBeConfirmed() {
279280 }
280281
281282 @ Test
282- void lineHashGone_shouldBeResolved () {
283+ void lineHashGone_shouldBeRoutedToAi () {
283284 String content = "alpha\n gamma\n delta" ;
284285 var hashes = LineHashSequence .from (content );
285286 String betaHash = LineHashSequence .hashLine ("beta" );
287+ // lineHash for "beta" no longer in file.
288+ // Should route to AI for verification, not auto-resolve.
286289 var results = engine .classifyByContent (
287290 List .of (issue (2 , null , betaHash )),
288291 hashes );
289292 assertThat (results ).hasSize (1 );
290293 assertThat (results .get (0 ).classification ())
291- .isEqualTo (IssueReconciliationEngine .Classification .RESOLVED );
294+ .isEqualTo (IssueReconciliationEngine .Classification .NEEDS_AI );
292295 }
293296
294297 @ Test
@@ -335,19 +338,18 @@ void contextHashChanged_blockScope_shouldBeNeedsAi() {
335338 void multipleIssues_mixedClassifications () {
336339 String content = "alpha\n beta\n gamma\n delta" ;
337340 var hashes = LineHashSequence .from (content );
338- String betaHash = LineHashSequence .hashLine ("beta" );
339341
340342 var results = engine .classifyByContent (List .of (
341343 issue (2 , "beta" ), // CONFIRMED (snippet found)
342- issue (3 , "zzzz" ), // RESOLVED (snippet gone)
344+ issue (3 , "zzzz" ), // NEEDS_AI (snippet gone — routed to AI )
343345 issueWithScope (1 , null , IssueScope .FILE ) // NEEDS_AI (FILE scope)
344346 ), hashes );
345347
346348 assertThat (results ).hasSize (3 );
347349 assertThat (results .get (0 ).classification ())
348350 .isEqualTo (IssueReconciliationEngine .Classification .CONFIRMED );
349351 assertThat (results .get (1 ).classification ())
350- .isEqualTo (IssueReconciliationEngine .Classification .RESOLVED );
352+ .isEqualTo (IssueReconciliationEngine .Classification .NEEDS_AI );
351353 assertThat (results .get (2 ).classification ())
352354 .isEqualTo (IssueReconciliationEngine .Classification .NEEDS_AI );
353355 }
@@ -404,26 +406,29 @@ void snippetStillPresent_shouldNotResolve() {
404406 }
405407
406408 @ Test
407- void snippetGone_shouldResolve () {
409+ void snippetGone_shouldNotAutoResolve () {
408410 String content = "alpha\n gamma\n delta" ;
409411 var hashes = LineHashSequence .from (content );
412+ // Snippet "beta" gone from file — but sweep should NOT auto-resolve.
413+ // Hash comparison alone is unreliable (LLM snippet not verbatim, null lineHash).
410414 var results = engine .sweepDeterministic (
411415 List .of (issue (2 , "beta" )),
412416 hashes );
413417 assertThat (results ).hasSize (1 );
414- assertThat (results .get (0 ).resolved ()).isTrue ();
418+ assertThat (results .get (0 ).resolved ()).isFalse ();
415419 }
416420
417421 @ Test
418- void lineHashGone_shouldResolve () {
422+ void lineHashGone_shouldNotAutoResolve () {
419423 String content = "alpha\n gamma\n delta" ;
420424 var hashes = LineHashSequence .from (content );
421425 String betaHash = LineHashSequence .hashLine ("beta" );
426+ // lineHash for "beta" gone — but sweep should NOT auto-resolve.
422427 var results = engine .sweepDeterministic (
423428 List .of (issue (2 , null , betaHash )),
424429 hashes );
425430 assertThat (results ).hasSize (1 );
426- assertThat (results .get (0 ).resolved ()).isTrue ();
431+ assertThat (results .get (0 ).resolved ()).isFalse ();
427432 }
428433
429434 @ Test
@@ -454,17 +459,16 @@ void blockScope_someSnippetLinesPresent_shouldNotResolve() {
454459 void multipleIssues_mixedResults () {
455460 String content = "alpha\n beta\n gamma" ;
456461 var hashes = LineHashSequence .from (content );
457- String betaHash = LineHashSequence .hashLine ("beta" );
458462 String zzzzHash = LineHashSequence .hashLine ("zzzz" );
459463
460464 var results = engine .sweepDeterministic (List .of (
461465 issue (2 , "beta" ), // present → not resolved
462- issue (2 , null , zzzzHash ) // gone → resolved
466+ issue (2 , null , zzzzHash ) // gone → still not auto- resolved (requires AI)
463467 ), hashes );
464468
465469 assertThat (results ).hasSize (2 );
466470 assertThat (results .get (0 ).resolved ()).isFalse ();
467- assertThat (results .get (1 ).resolved ()).isTrue ();
471+ assertThat (results .get (1 ).resolved ()).isFalse ();
468472 }
469473 }
470474
@@ -490,10 +494,12 @@ void classifyByContent_nullAst_shouldFallBackToBase() {
490494 void sweepDeterministic_nullAst_shouldFallBackToBase () {
491495 String content = "alpha\n gamma\n delta" ;
492496 var hashes = LineHashSequence .from (content );
497+ // AST overload with null tree/resolver falls back to base method,
498+ // which no longer auto-resolves (anchor not found → skip, not resolve)
493499 var results = engine .sweepDeterministic (
494500 List .of (issue (2 , "beta" )), hashes , null , null );
495501 assertThat (results ).hasSize (1 );
496- assertThat (results .get (0 ).resolved ()).isTrue ();
502+ assertThat (results .get (0 ).resolved ()).isFalse ();
497503 }
498504
499505 @ Test
0 commit comments