From a43c6db94e95f5a6eeb22cb8154d5893e4f3e101 Mon Sep 17 00:00:00 2001 From: Chris Huber Date: Sun, 7 Jun 2026 08:44:10 -0400 Subject: [PATCH 1/2] fix: compact abandoned cleanup pagination handles --- inc/Cli/Commands/WorkspaceCommand.php | 34 +++++++++++++++++++++++++++ tests/smoke-worktree-cleanup-cli.php | 9 +++++++ 2 files changed, 43 insertions(+) diff --git a/inc/Cli/Commands/WorkspaceCommand.php b/inc/Cli/Commands/WorkspaceCommand.php index 5e081b1..6dbe53b 100644 --- a/inc/Cli/Commands/WorkspaceCommand.php +++ b/inc/Cli/Commands/WorkspaceCommand.php @@ -3400,6 +3400,8 @@ private function render_worktree_abandoned_result( array $result, array $assoc_a * @return array */ private function compact_worktree_abandoned_result( array $result ): array { + $result['steps'] = $this->compact_worktree_abandoned_steps( (array) ( $result['steps'] ?? array() ) ); + $blocked = (array) ( $result['blocked'] ?? array() ); if ( count($blocked) <= 25 ) { return $result; @@ -3435,6 +3437,38 @@ private function compact_worktree_abandoned_result( array $result ): array { return $result; } + /** + * Compact large nested step pagination handle lists. + * + * @param array $steps Abandoned cleanup step summaries. + * @return array + */ + private function compact_worktree_abandoned_steps( array $steps ): array { + foreach ( $steps as $step_key => $step ) { + if ( ! is_array($step) ) { + continue; + } + + $pagination = (array) ( $step['pagination'] ?? array() ); + foreach ( array( 'remaining_handles', 'handles' ) as $field ) { + $handles = (array) ( $pagination[ $field ] ?? array() ); + if ( count($handles) <= 25 ) { + continue; + } + + $pagination[ $field . '_examples' ] = array_slice(array_values($handles), 0, 25); + $pagination[ $field . '_truncated' ] = true; + $pagination[ $field . '_count' ] = count($handles); + unset($pagination[ $field ]); + } + + $step['pagination'] = $pagination; + $steps[ $step_key ] = $step; + } + + return $steps; + } + /** * Render CLI output for worktree operations. * diff --git a/tests/smoke-worktree-cleanup-cli.php b/tests/smoke-worktree-cleanup-cli.php index 05e5950..145dd82 100644 --- a/tests/smoke-worktree-cleanup-cli.php +++ b/tests/smoke-worktree-cleanup-cli.php @@ -577,6 +577,7 @@ public function execute( array $input ): array 'reason' => 'large blocked output fixture', ); } + $remaining_handles = array_map(fn( $row ) => (string) ( $row['handle'] ?? '' ), $skipped); return array( 'success' => true, @@ -590,6 +591,10 @@ public function execute( array $input ): array 'bytes_reclaimed' => empty($input['dry_run']) ? 4096 : 0, ), 'skipped' => $skipped, + 'pagination' => array( + 'remaining_total' => count($remaining_handles), + 'remaining_handles' => $remaining_handles, + ), ); } } @@ -1168,6 +1173,9 @@ public function execute( array $input ): array datamachine_code_cleanup_assert(array() === ( $abandoned_compact_json['blocked'] ?? null ), 'abandoned compact JSON omits full blocked rows'); datamachine_code_cleanup_assert(true === ( $abandoned_compact_json['evidence']['blocked_truncated'] ?? false ), 'abandoned compact JSON records blocked truncation evidence'); datamachine_code_cleanup_assert(isset($abandoned_compact_json['blocked_examples']['active_no_signal'][0]['handle']), 'abandoned compact JSON includes grouped blocked examples'); + datamachine_code_cleanup_assert(! isset($abandoned_compact_json['steps']['bounded_apply_initial']['pagination']['remaining_handles']), 'abandoned compact JSON omits full nested remaining handles'); + datamachine_code_cleanup_assert(32 === (int) ( $abandoned_compact_json['steps']['bounded_apply_initial']['pagination']['remaining_handles_count'] ?? 0 ), 'abandoned compact JSON keeps nested remaining handle count'); + datamachine_code_cleanup_assert(25 === count($abandoned_compact_json['steps']['bounded_apply_initial']['pagination']['remaining_handles_examples'] ?? array()), 'abandoned compact JSON keeps bounded nested handle examples'); WP_CLI::$logs = array(); WP_CLI::$successes = array(); @@ -1175,6 +1183,7 @@ public function execute( array $input ): array $abandoned_verbose_json = json_decode(WP_CLI::$logs[0] ?? '', true); datamachine_code_cleanup_assert(JSON_ERROR_NONE === json_last_error(), 'abandoned verbose JSON output parses cleanly'); datamachine_code_cleanup_assert(32 === count($abandoned_verbose_json['blocked'] ?? array()), 'abandoned verbose JSON keeps full blocked rows'); + datamachine_code_cleanup_assert(32 === count($abandoned_verbose_json['steps']['bounded_apply_initial']['pagination']['remaining_handles'] ?? array()), 'abandoned verbose JSON keeps full nested remaining handles'); datamachine_code_cleanup_assert(! isset($abandoned_verbose_json['evidence']['blocked_truncated']), 'abandoned verbose JSON does not report truncation'); $bounded_apply_ability->extra_skipped = 0; From 77ca8f3ba099c7a9319414dcc1bd71fd34cc2eaa Mon Sep 17 00:00:00 2001 From: Chris Huber Date: Sun, 7 Jun 2026 08:50:16 -0400 Subject: [PATCH 2/2] chore: align compact pagination assignment --- inc/Cli/Commands/WorkspaceCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/Cli/Commands/WorkspaceCommand.php b/inc/Cli/Commands/WorkspaceCommand.php index 6dbe53b..b006dd9 100644 --- a/inc/Cli/Commands/WorkspaceCommand.php +++ b/inc/Cli/Commands/WorkspaceCommand.php @@ -3462,7 +3462,7 @@ private function compact_worktree_abandoned_steps( array $steps ): array { unset($pagination[ $field ]); } - $step['pagination'] = $pagination; + $step['pagination'] = $pagination; $steps[ $step_key ] = $step; }