@@ -606,8 +606,11 @@ def manifest_complete_commit_ranges(
606606 """
607607 if range_size <= 0 :
608608 raise ValueError (f"range_size must be positive, got { range_size } " )
609- if any (k == f"{ repo } ::commits" or k .startswith (f"{ repo } ::r" )
610- for k in manifest .failed ):
609+ # A repo-level failure records an earlier extraction attempt, not a unit of
610+ # range coverage. Once the authoritative plan and every range prove exact
611+ # coverage it is stale. A failed range remains authoritative and must keep
612+ # completion fail-closed until that same range key is marked done.
613+ if any (k .startswith (f"{ repo } ::r" ) for k in manifest .failed ):
611614 return None
612615
613616 plan = manifest .done .get (commit_plan_key (repo ))
@@ -660,6 +663,52 @@ def manifest_complete_commit_ranges(
660663 return tuple (ranges )
661664
662665
666+ def mark_commit_stream_complete (
667+ repo : str ,
668+ manifest : Manifest ,
669+ manifest_lock : threading .Lock | None ,
670+ complete_ranges : Sequence [tuple [int , int ]],
671+ ) -> dict :
672+ """Persist aggregate completion proven by the plan and exact range coverage.
673+
674+ ``Manifest.mark_done`` also removes an earlier aggregate failure. Keeping
675+ this as a derived summary avoids treating ``repo::commits`` as a second,
676+ independent source of completion truth.
677+ """
678+ if not complete_ranges :
679+ raise ValueError (f"cannot mark { repo } ::commits complete without ranges" )
680+ plan = manifest .done .get (commit_plan_key (repo ))
681+ if not isinstance (plan , dict ) or plan .get ("source" ) != "commit_plan" :
682+ raise RuntimeError (
683+ f"cannot mark { repo } ::commits complete without authoritative commit_plan"
684+ )
685+ try :
686+ n_records = int (plan ["n_records" ])
687+ except (KeyError , TypeError , ValueError ) as exc :
688+ raise RuntimeError (
689+ f"cannot mark { repo } ::commits complete: invalid commit_plan n_records"
690+ ) from exc
691+ if complete_ranges [0 ][0 ] != 0 or complete_ranges [- 1 ][1 ] != n_records :
692+ raise RuntimeError (
693+ f"cannot mark { repo } ::commits complete: ranges do not cover "
694+ f"[0, { n_records } )"
695+ )
696+ info = {
697+ "source" : "commits" ,
698+ "repo" : repo ,
699+ "complete" : True ,
700+ "completion_proof" : "commit_plan_exact_range_coverage" ,
701+ "n_records" : n_records ,
702+ "range_count" : len (complete_ranges ),
703+ }
704+ if manifest_lock is None :
705+ manifest .mark_done (f"{ repo } ::commits" , info )
706+ else :
707+ with manifest_lock :
708+ manifest .mark_done (f"{ repo } ::commits" , info )
709+ return info
710+
711+
663712def manifest_done_commit_intervals (repo : str , manifest : Manifest ) -> tuple [tuple [int , int ], ...]:
664713 """Return validated done commit intervals for ``repo``.
665714
@@ -1295,6 +1344,7 @@ def should_stage_repo_from_manifest(
12951344 manifest : Manifest ,
12961345 range_size : int ,
12971346 only_repos : set [str ] | None ,
1347+ manifest_lock : threading .Lock | None = None ,
12981348) -> bool :
12991349 """Return False when the manifest proves this repo needs no extraction.
13001350
@@ -1310,10 +1360,20 @@ def should_stage_repo_from_manifest(
13101360 return False
13111361
13121362 code_needed = streams in {"both" , "code" } and not manifest .is_done (code_key (repo ))
1313- commits_needed = (
1314- streams in {"both" , "commits" }
1315- and manifest_complete_commit_ranges (repo , manifest , range_size ) is None
1316- )
1363+ commits_needed = False
1364+ if streams in {"both" , "commits" }:
1365+ complete_ranges = manifest_complete_commit_ranges (repo , manifest , range_size )
1366+ commits_needed = complete_ranges is None
1367+ if complete_ranges is not None :
1368+ # This callback can skip extraction entirely, so reconcile the
1369+ # derived aggregate sentinel here instead of waiting for
1370+ # run_commits_half, which will never be called for this repo.
1371+ mark_commit_stream_complete (
1372+ repo ,
1373+ manifest ,
1374+ manifest_lock ,
1375+ complete_ranges ,
1376+ )
13171377 return code_needed or commits_needed
13181378
13191379
@@ -1872,6 +1932,12 @@ def run_commits_half(
18721932 if complete_ranges is not None :
18731933 first = complete_ranges [0 ][0 ]
18741934 last = complete_ranges [- 1 ][1 ]
1935+ mark_commit_stream_complete (
1936+ repo ,
1937+ manifest ,
1938+ manifest_lock ,
1939+ complete_ranges ,
1940+ )
18751941 _log (
18761942 f"SKIP (done) { repo } ::commits: manifest covers "
18771943 f"{ len (complete_ranges )} range(s) [{ first } :{ last } ); "
@@ -2246,7 +2312,15 @@ def handle_commit_range(
22462312 # True iff EVERY range for this repo is now marked done in the manifest
22472313 # (covers resume-skipped + newly-done; excludes cancelled/failed). Drives
22482314 # temp + extract-cache retention in process_one_repo.
2249- all_ranges_done = manifest_covers_commit_span (repo , manifest , n_records )
2315+ complete_ranges = manifest_complete_commit_ranges (repo , manifest , range_size )
2316+ all_ranges_done = complete_ranges is not None
2317+ if complete_ranges is not None :
2318+ mark_commit_stream_complete (
2319+ repo ,
2320+ manifest ,
2321+ manifest_lock ,
2322+ complete_ranges ,
2323+ )
22502324 return done , failed , all_ranges_done
22512325
22522326
@@ -2987,6 +3061,7 @@ def should_process(repo: str) -> bool:
29873061 manifest = manifest ,
29883062 range_size = args .range_size ,
29893063 only_repos = only_repos ,
3064+ manifest_lock = manifest_lock ,
29903065 )
29913066 if should_stage :
29923067 ensure_min_free_disk (
0 commit comments