@@ -2144,18 +2144,14 @@ private function build_active_no_signal_finalized_metadata( array $row ): array|
21442144 return new \WP_Error ('missing_pr_url ' , 'merged PR evidence is missing html_url ' );
21452145 }
21462146
2147- $ base_metadata = is_array ($ row ['metadata ' ] ?? null ) ? $ row ['metadata ' ] : array ();
2148- $ metadata = array_merge (
2149- $ base_metadata ,
2150- array (
2151- 'handle ' => $ handle ,
2152- 'repo ' => $ repo ,
2153- 'branch ' => $ branch ,
2154- 'path ' => $ path ,
2155- 'observed_at ' => gmdate ('c ' ),
2156- 'last_seen_at ' => gmdate ('c ' ),
2157- ),
2158- WorktreeContextInjector::build_finalizer_metadata (WorktreeContextInjector::STATE_MERGED , $ pr_url )
2147+ $ metadata = $ this ->build_active_no_signal_cleanup_metadata (
2148+ $ row ,
2149+ $ handle ,
2150+ $ repo ,
2151+ $ branch ,
2152+ $ path ,
2153+ WorktreeContextInjector::STATE_MERGED ,
2154+ $ pr_url
21592155 );
21602156 $ metadata ['auto_finalized_by ' ] = 'active_no_signal_finalized_apply ' ;
21612157 $ metadata ['auto_finalized_signal ' ] = 'pr-merged ' ;
@@ -2210,18 +2206,13 @@ private function build_active_no_signal_equivalent_clean_metadata( array $row ):
22102206 return $ equivalence ;
22112207 }
22122208
2213- $ base_metadata = is_array ($ row ['metadata ' ] ?? null ) ? $ row ['metadata ' ] : array ();
2214- $ metadata = array_merge (
2215- $ base_metadata ,
2216- array (
2217- 'handle ' => $ handle ,
2218- 'repo ' => $ repo ,
2219- 'branch ' => $ branch ,
2220- 'path ' => $ path ,
2221- 'observed_at ' => gmdate ('c ' ),
2222- 'last_seen_at ' => gmdate ('c ' ),
2223- ),
2224- WorktreeContextInjector::build_finalizer_metadata (WorktreeContextInjector::STATE_CLEANUP_ELIGIBLE )
2209+ $ metadata = $ this ->build_active_no_signal_cleanup_metadata (
2210+ $ row ,
2211+ $ handle ,
2212+ $ repo ,
2213+ $ branch ,
2214+ $ path ,
2215+ WorktreeContextInjector::STATE_CLEANUP_ELIGIBLE
22252216 );
22262217 $ effective_status = (string ) ( $ equivalence ['upstream_equivalence ' ]['effective_status ' ] ?? '' );
22272218 $ signal = 'contained_non_default_remote ' === $ effective_status ? 'contained-non-default-remote ' : 'upstream-equivalent-clean ' ;
@@ -2261,18 +2252,13 @@ private function build_active_no_signal_merged_to_default_metadata( array $row )
22612252 return $ evidence ;
22622253 }
22632254
2264- $ base_metadata = is_array ($ row ['metadata ' ] ?? null ) ? $ row ['metadata ' ] : array ();
2265- $ metadata = array_merge (
2266- $ base_metadata ,
2267- array (
2268- 'handle ' => $ handle ,
2269- 'repo ' => $ repo ,
2270- 'branch ' => $ branch ,
2271- 'path ' => (string ) ( $ evidence ['path ' ] ?? $ path ),
2272- 'observed_at ' => gmdate ('c ' ),
2273- 'last_seen_at ' => gmdate ('c ' ),
2274- ),
2275- WorktreeContextInjector::build_finalizer_metadata (WorktreeContextInjector::STATE_MERGED )
2255+ $ metadata = $ this ->build_active_no_signal_cleanup_metadata (
2256+ $ row ,
2257+ $ handle ,
2258+ $ repo ,
2259+ $ branch ,
2260+ (string ) ( $ evidence ['path ' ] ?? $ path ),
2261+ WorktreeContextInjector::STATE_MERGED
22762262 );
22772263 $ metadata ['auto_finalized_by ' ] = 'active_no_signal_merged_apply ' ;
22782264 $ metadata ['auto_finalized_signal ' ] = 'merged-to-default ' ;
@@ -2299,25 +2285,57 @@ private function build_active_no_signal_remote_clean_metadata( array $row ): arr
22992285 return $ evidence ;
23002286 }
23012287
2302- $ base_metadata = is_array ($ row ['metadata ' ] ?? null ) ? $ row ['metadata ' ] : array ();
2303- $ metadata = array_merge (
2288+ $ metadata = $ this ->build_active_no_signal_cleanup_metadata (
2289+ $ row ,
2290+ $ handle ,
2291+ $ repo ,
2292+ $ branch ,
2293+ (string ) ( $ evidence ['path ' ] ?? $ path ),
2294+ WorktreeContextInjector::STATE_CLEANUP_ELIGIBLE
2295+ );
2296+ $ metadata ['auto_finalized_by ' ] = 'active_no_signal_remote_clean_apply ' ;
2297+ $ metadata ['auto_finalized_signal ' ] = 'remote-tracking-clean ' ;
2298+ $ metadata ['auto_finalized_reason ' ] = 'active/no-signal report found a clean local worktree whose work is preserved by its remote branch ' ;
2299+ $ metadata ['cleanup_eligibility_evidence ' ] = $ evidence ;
2300+
2301+ return $ metadata ;
2302+ }
2303+
2304+ /**
2305+ * Build the common cleanup metadata envelope for active/no-signal apply paths.
2306+ *
2307+ * @param array<string,mixed> $row Evidence row.
2308+ * @param string $handle Worktree handle.
2309+ * @param string $repo Repository name.
2310+ * @param string $branch Branch name.
2311+ * @param string $path Canonical worktree path to store.
2312+ * @param string $finalizer_state Lifecycle finalizer state.
2313+ * @param string|null $finalizer_url Optional finalizer URL.
2314+ * @return array<string,mixed>
2315+ */
2316+ private function build_active_no_signal_cleanup_metadata (
2317+ array $ row ,
2318+ string $ handle ,
2319+ string $ repo ,
2320+ string $ branch ,
2321+ string $ path ,
2322+ string $ finalizer_state ,
2323+ ?string $ finalizer_url = null
2324+ ): array {
2325+ $ base_metadata = is_array ($ row ['metadata ' ] ?? null ) ? $ row ['metadata ' ] : array ();
2326+
2327+ return array_merge (
23042328 $ base_metadata ,
23052329 array (
23062330 'handle ' => $ handle ,
23072331 'repo ' => $ repo ,
23082332 'branch ' => $ branch ,
2309- 'path ' => ( string ) ( $ evidence [ ' path ' ] ?? $ path ) ,
2333+ 'path ' => $ path ,
23102334 'observed_at ' => gmdate ('c ' ),
23112335 'last_seen_at ' => gmdate ('c ' ),
23122336 ),
2313- WorktreeContextInjector::build_finalizer_metadata (WorktreeContextInjector:: STATE_CLEANUP_ELIGIBLE )
2337+ WorktreeContextInjector::build_finalizer_metadata ($ finalizer_state , $ finalizer_url )
23142338 );
2315- $ metadata ['auto_finalized_by ' ] = 'active_no_signal_remote_clean_apply ' ;
2316- $ metadata ['auto_finalized_signal ' ] = 'remote-tracking-clean ' ;
2317- $ metadata ['auto_finalized_reason ' ] = 'active/no-signal report found a clean local worktree whose work is preserved by its remote branch ' ;
2318- $ metadata ['cleanup_eligibility_evidence ' ] = $ evidence ;
2319-
2320- return $ metadata ;
23212339 }
23222340
23232341 /**
0 commit comments