Skip to content

GH#5147: Clean up orphaned supervisor-helper.sh and supervisor/ during update#5151

Merged
alex-solovyev merged 2 commits intomainfrom
bugfix/cleanup-orphaned-supervisor
Mar 17, 2026
Merged

GH#5147: Clean up orphaned supervisor-helper.sh and supervisor/ during update#5151
alex-solovyev merged 2 commits intomainfrom
bugfix/cleanup-orphaned-supervisor

Conversation

@alex-solovyev
Copy link
Copy Markdown
Collaborator

@alex-solovyev alex-solovyev commented Mar 17, 2026

Summary

  • Adds migrate_orphaned_supervisor() migration to setup-modules/migrations.sh that removes orphaned supervisor-helper.sh, supervisor/ module directory, old cron entries, and old launchd plists left behind after the supervisor-to-pulse-wrapper migration
  • Wires the migration into both interactive and non-interactive setup.sh paths, running after cleanup_deprecated_paths and before the pulse scheduler section
  • Adds 10-test suite (tests/test-migrate-orphaned-supervisor.sh) covering file removal, directory safety checks, cron migration, and idempotency

Problem

After upgrading to v3.0.12, aidevops update (rsync) only adds/overwrites files — it doesn't delete files removed from the source. Users who installed before the supervisor-to-pulse-wrapper migration (PR #2291, PR #2475) retain orphaned files that shadow the new architecture:

  • ~/.aidevops/agents/scripts/supervisor-helper.sh (old entry point)
  • ~/.aidevops/agents/scripts/supervisor/ (old module directory with pulse.sh, dispatch.sh, etc.)
  • Cron/launchd entries still invoking supervisor-helper.sh pulse

The old code has known bugs (stdin consumption in ai_decide() causing only 1 task per pulse) that are fixed in pulse-wrapper.sh.

What the migration does

  1. Removes orphaned supervisor-helper.sh from ~/.aidevops/agents/scripts/ (does NOT touch supervisor-archived/)
  2. Removes orphaned supervisor/ directory only if it contains recognizable module files (pulse.sh, dispatch.sh, _common.sh) — preserves user-created directories
  3. Removes cron entries referencing supervisor-helper.sh — setup.sh will install pulse-wrapper.sh entries if pulse is enabled
  4. Removes old launchd plist with com.aidevops.supervisor-pulse label (macOS)

Verification

  • bash tests/test-migrate-orphaned-supervisor.sh — 10/10 pass
  • shellcheck setup-modules/migrations.sh — 0 violations
  • bash -n setup.sh — syntax OK

Closes #5147

Summary by CodeRabbit

  • New Features

    • The setup process now automatically cleans up and migrates outdated configurations, removing legacy artifacts and consolidating obsolete entries while preserving archived data for improved system maintenance.
  • Tests

    • Added comprehensive test coverage for the new cleanup and migration functionality, including edge case handling.

…date (GH#5147)

After the supervisor-to-pulse-wrapper migration, aidevops update (rsync)
only adds/overwrites files — it doesn't delete files that no longer exist
in the source. Users who installed before the migration retain orphaned
supervisor-helper.sh and supervisor/ modules that shadow pulse-wrapper.sh.

Add migrate_orphaned_supervisor() to setup-modules/migrations.sh that:
- Removes orphaned scripts/supervisor-helper.sh from deployed agents
- Removes orphaned scripts/supervisor/ module directory (with safety check)
- Removes cron entries referencing supervisor-helper.sh
- Removes old launchd plist with com.aidevops.supervisor-pulse label (macOS)

The migration is wired into both interactive and non-interactive setup paths,
running after cleanup_deprecated_paths and before the pulse scheduler section
so old entries are cleaned before new ones are installed.

Closes #5147
@gemini-code-assist
Copy link
Copy Markdown

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request addresses the issue of orphaned files and scheduler entries left behind after the supervisor-to-pulse-wrapper migration. Previously, aidevops update did not remove files no longer present in the source, leading to old supervisor-helper.sh scripts, supervisor/ directories, and cron/launchd entries shadowing the new architecture and causing known bugs. The changes introduce a migration script that systematically removes these outdated artifacts, ensuring a clean transition to the pulse-wrapper.sh system.

Highlights

  • New Migration Function: Introduced migrate_orphaned_supervisor() in setup-modules/migrations.sh to clean up legacy supervisor files and scheduler entries.
  • Integration into Setup: The new migration is integrated into both interactive and non-interactive setup.sh paths, ensuring its execution during updates.
  • Comprehensive Testing: A new 10-test suite (tests/test-migrate-orphaned-supervisor.sh) was added to cover file removal, directory safety, cron migration, and idempotency.
Changelog
  • setup-modules/migrations.sh
    • Added migrate_orphaned_supervisor function to handle the cleanup of old supervisor files, directories, cron entries, and launchd plists.
  • setup.sh
    • Called migrate_orphaned_supervisor after cleanup_deprecated_paths in the non-interactive setup flow.
    • Added a confirm_step for migrate_orphaned_supervisor in the interactive setup flow.
  • tests/test-migrate-orphaned-supervisor.sh
    • Added a new shell script containing tests for the migrate_orphaned_supervisor function, covering various cleanup scenarios and idempotency.
Activity
  • The new test suite tests/test-migrate-orphaned-supervisor.sh passed all 10 tests.
  • shellcheck reported 0 violations for setup-modules/migrations.sh.
  • bash -n confirmed syntax correctness for setup.sh.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 17, 2026

Warning

Rate limit exceeded

@alex-solovyev has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 21 minutes and 7 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: b25621c3-3c07-4fe2-bb60-94f2edb186d3

📥 Commits

Reviewing files that changed from the base of the PR and between e76be25 and 91da7ea.

📒 Files selected for processing (1)
  • setup-modules/migrations.sh

Walkthrough

This PR adds a migration function that detects and cleans up orphaned supervisor-helper.sh and supervisor/ artifacts from pre-3.0.12 installations, migrates cron entries to pulse-wrapper.sh, removes legacy macOS LaunchAgent configurations, and integrates this cleanup into the setup flow with comprehensive test coverage.

Changes

Cohort / File(s) Summary
Migration Implementation
setup-modules/migrations.sh
Adds migrate_orphaned_supervisor() function that removes orphaned supervisor artifacts, migrates cron entries from supervisor-helper.sh pulse to pulse-wrapper.sh, cleans up macOS LaunchAgent entries, and prints status summaries. Includes conditional crontab and launchd manipulation with progress messaging.
Setup Integration
setup.sh
Integrates the new migration into both non-interactive and interactive setup flows, calling migrate_orphaned_supervisor() after cleanup_deprecated_paths() to ensure orphaned supervisor artifacts are removed during updates.
Test Coverage
tests/test-migrate-orphaned-supervisor.sh
Comprehensive Bash test suite validating migration behavior: cleanup of orphaned files/directories, preservation of supervisor-archived/, idempotent behavior, cron entry removal, and edge cases. Includes test harness, isolated HOME environment, and dependency stubbing.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🧹 The supervisor's ghost haunts the crontab still,
But pulse-wrapper claims the honored hill.
Old helpers fade to archive's resting place,
While fresh migrations bring clean code to grace. ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 35.29% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically describes the main change: adding cleanup for orphaned supervisor artifacts during updates, directly addressing issue #5147.
Linked Issues check ✅ Passed The PR fully implements all requirements from issue #5147: removes supervisor-helper.sh, removes supervisor/ with safety checks, migrates/removes cron entries, removes legacy macOS plist, and includes comprehensive tests.
Out of Scope Changes check ✅ Passed All changes are directly scoped to the migration objective—no unrelated modifications detected. The three files address migration logic, integration points, and testing.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch bugfix/cleanup-orphaned-supervisor
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Tip

You can disable the changed files summary in the walkthrough.

Disable the reviews.changed_files_summary setting to disable the changed files summary in the walkthrough.

@github-actions
Copy link
Copy Markdown
Contributor

🔍 Code Quality Report

�[0;35m[MONITOR]�[0m Code Review Monitoring Report

�[0;34m[INFO]�[0m Latest Quality Status:
SonarCloud: 0 bugs, 0 vulnerabilities, 468 code smells

�[0;34m[INFO]�[0m Recent monitoring activity:
Tue Mar 17 15:29:35 UTC 2026: Code review monitoring started
Tue Mar 17 15:29:36 UTC 2026: SonarCloud - Bugs: 0, Vulnerabilities: 0, Code Smells: 468

📈 Current Quality Metrics

  • BUGS: 0
  • CODE SMELLS: 468
  • VULNERABILITIES: 0

Generated on: Tue Mar 17 15:29:39 UTC 2026


Generated by AI DevOps Framework Code Review Monitoring

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a migration script to clean up orphaned files and scheduler entries from a previous architecture, which is a valuable improvement for maintainability. The changes are well-structured, with a new migration function and a comprehensive test suite. I've identified two areas in the migration script that could be made more robust, specifically regarding the cleanup of crontab entries and launchd agents on macOS. My suggestions have been refined to ensure adherence to repository guidelines against blanket error suppression, aiming for more reliable and debuggable cleanup operations.

Comment on lines +1035 to +1040
if [[ -f "$old_plist" ]] || _launchd_has_agent "$old_label" 2>/dev/null; then
launchctl unload "$old_plist" 2>/dev/null || true
rm -f "$old_plist"
print_info "Removed orphaned supervisor-pulse LaunchAgent ($old_label)"
((++cleaned))
fi
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

There's a potential issue in the launchd cleanup logic. If an agent is loaded but its corresponding .plist file is missing (an orphaned agent), launchctl unload "$old_plist" will fail because the path doesn't exist, and the agent won't be removed.

A more robust approach is to use launchctl remove "$old_label", which unloads and removes the agent by its label, working correctly even if the .plist file is gone. This ensures that orphaned agents are properly cleaned up. I've removed 2>/dev/null from the launchctl remove command and the _launchd_has_agent check in the suggestion to avoid blanket suppression of errors, allowing potential issues to be visible for debugging, as per repository guidelines.

Suggested change
if [[ -f "$old_plist" ]] || _launchd_has_agent "$old_label" 2>/dev/null; then
launchctl unload "$old_plist" 2>/dev/null || true
rm -f "$old_plist"
print_info "Removed orphaned supervisor-pulse LaunchAgent ($old_label)"
((++cleaned))
fi
if _launchd_has_agent "$old_label" || [[ -f "$old_plist" ]]; then
# Use `remove` by label, which is more robust as it works even if the plist file is missing.
launchctl remove "$old_label" || true
# Also remove the plist file if it exists.
rm -f "$old_plist"
print_info "Removed orphaned supervisor-pulse LaunchAgent ($old_label)"
((++cleaned))
fi
References
  1. Avoid using '2>/dev/null' for blanket suppression of command errors in shell scripts to ensure that authentication, syntax, or system issues remain visible for debugging.

printf '%s\n' "$new_crontab" | crontab - 2>/dev/null || true
else
# All entries were supervisor-helper.sh — clear crontab
echo "" | crontab - 2>/dev/null || true
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The comment on the preceding line states "clear crontab", but echo "" | crontab - installs a crontab with a single empty line rather than removing it. To truly clear the crontab, crontab -r should be used. This would also be more consistent with the test script (tests/test-migrate-orphaned-supervisor.sh), which uses crontab -r to restore the crontab to its original state. I've removed 2>/dev/null from the suggestion to avoid blanket suppression of errors, allowing potential issues like permissions problems to be visible for debugging, as per repository guidelines.

Suggested change
echo "" | crontab - 2>/dev/null || true
crontab -r || true
References
  1. Avoid using '2>/dev/null' for blanket suppression of command errors in shell scripts to ensure that authentication, syntax, or system issues remain visible for debugging.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
tests/test-migrate-orphaned-supervisor.sh (1)

186-222: Cron test manipulates real system crontab — consider documenting this behavior.

The test saves and restores the original crontab, which is the correct approach for testing cron manipulation. However, if the test crashes between lines 196 and 214-219, the system crontab would be left with test entries.

The test entries are clearly marked (# aidevops: test-keep), so they're identifiable. Consider adding a comment noting this behavior, or wrapping the cron test section in a subshell with a trap for safer cleanup.

Optional: Add trap for safer crontab restoration
 # ============================================================================
 section "Test: removes cron entries referencing supervisor-helper.sh"
 # ============================================================================
 
 # Install a fake cron entry (only if crontab is available)
 if command -v crontab &>/dev/null; then
 	# Save current crontab
 	original_crontab=$(crontab -l 2>/dev/null) || original_crontab=""
+	
+	# Ensure crontab is restored even if test fails
+	restore_crontab() {
+		if [[ -n "$original_crontab" ]]; then
+			printf '%s\n' "$original_crontab" | crontab - 2>/dev/null || true
+		else
+			crontab -r 2>/dev/null || true
+		fi
+	}
+	trap restore_crontab RETURN
 
 	# Install test crontab with supervisor-helper.sh entry
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/test-migrate-orphaned-supervisor.sh` around lines 186 - 222, The test
manipulates the real system crontab and can leave test entries if it aborts;
protect and restore crontab by adding a cleanup trap or running the
crontab-modifying block in a subshell that always restores original_crontab on
EXIT. Specifically, around the block that sets original_crontab, pipes the test
crontab into crontab, calls migrate_orphaned_supervisor, and reads new_crontab,
ensure you register a trap (or use a subshell) that will run the same restore
logic (using original_crontab and crontab -r fallback) on EXIT/ERR so the code
in migrate_orphaned_supervisor and the original_crontab/new_crontab variables
are always cleaned up even if the test fails.
setup-modules/migrations.sh (1)

1016-1021: Consider using crontab -r when clearing all entries.

When all cron entries were supervisor-helper.sh entries, the current approach installs an empty crontab via echo "" | crontab -. This works, but leaves an empty crontab file. Using crontab -r would fully remove the crontab.

However, this is a minor point — an empty crontab is functionally equivalent and crontab -r fails if there's no crontab, requiring additional handling.

Alternative: use crontab -r for full removal
 		if [[ -n "$new_crontab" ]]; then
 			printf '%s\n' "$new_crontab" | crontab - 2>/dev/null || true
 		else
 			# All entries were supervisor-helper.sh — clear crontab
-			echo "" | crontab - 2>/dev/null || true
+			crontab -r 2>/dev/null || true
 		fi
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@setup-modules/migrations.sh` around lines 1016 - 1021, The cleanup branch
that currently does echo "" | crontab - when new_crontab is empty should instead
remove the crontab entirely using crontab -r, but handle the case where no
crontab exists; modify the else block that handles supervisor-helper.sh-only
entries to attempt crontab -r and fall back to the existing echo "" | crontab -
(or only call crontab -r after verifying a crontab exists with crontab -l) so
you fully remove the crontab when present without causing errors when none
exists.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@setup-modules/migrations.sh`:
- Around line 1016-1021: The cleanup branch that currently does echo "" |
crontab - when new_crontab is empty should instead remove the crontab entirely
using crontab -r, but handle the case where no crontab exists; modify the else
block that handles supervisor-helper.sh-only entries to attempt crontab -r and
fall back to the existing echo "" | crontab - (or only call crontab -r after
verifying a crontab exists with crontab -l) so you fully remove the crontab when
present without causing errors when none exists.

In `@tests/test-migrate-orphaned-supervisor.sh`:
- Around line 186-222: The test manipulates the real system crontab and can
leave test entries if it aborts; protect and restore crontab by adding a cleanup
trap or running the crontab-modifying block in a subshell that always restores
original_crontab on EXIT. Specifically, around the block that sets
original_crontab, pipes the test crontab into crontab, calls
migrate_orphaned_supervisor, and reads new_crontab, ensure you register a trap
(or use a subshell) that will run the same restore logic (using original_crontab
and crontab -r fallback) on EXIT/ERR so the code in migrate_orphaned_supervisor
and the original_crontab/new_crontab variables are always cleaned up even if the
test fails.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d0ae46d2-75e8-411c-8f41-e8cc33fd2f0e

📥 Commits

Reviewing files that changed from the base of the PR and between 0d2ddce and e76be25.

📒 Files selected for processing (3)
  • setup-modules/migrations.sh
  • setup.sh
  • tests/test-migrate-orphaned-supervisor.sh

- Line 1020: replace 'echo "" | crontab -' with 'crontab -r' to truly
  clear the crontab when all entries were supervisor-helper.sh references
  (Gemini Code Assist MEDIUM suggestion)

- Line 1036: replace 'launchctl unload "$old_plist"' with
  'launchctl remove "$old_label"' so orphaned agents loaded without a
  backing plist file on disk are still unloaded correctly
  (Gemini Code Assist HIGH suggestion)

shellcheck: 0 violations | tests: 10/10 pass
@alex-solovyev alex-solovyev merged commit 94d5052 into main Mar 17, 2026
10 of 12 checks passed
@alex-solovyev alex-solovyev deleted the bugfix/cleanup-orphaned-supervisor branch March 17, 2026 15:38
@github-actions
Copy link
Copy Markdown
Contributor

🔍 Code Quality Report

�[0;35m[MONITOR]�[0m Code Review Monitoring Report

�[0;34m[INFO]�[0m Latest Quality Status:
SonarCloud: 0 bugs, 0 vulnerabilities, 468 code smells

�[0;34m[INFO]�[0m Recent monitoring activity:
Tue Mar 17 15:38:41 UTC 2026: Code review monitoring started
Tue Mar 17 15:38:42 UTC 2026: SonarCloud - Bugs: 0, Vulnerabilities: 0, Code Smells: 468

📈 Current Quality Metrics

  • BUGS: 0
  • CODE SMELLS: 468
  • VULNERABILITIES: 0

Generated on: Tue Mar 17 15:38:44 UTC 2026


Generated by AI DevOps Framework Code Review Monitoring

@sonarqubecloud
Copy link
Copy Markdown

@marcusquinn
Copy link
Copy Markdown
Owner

Dispatching worker to address Gemini review suggestions (1 high, 1 medium).

  • Model: sonnet (default round-robin)
  • Branch: bugfix/cleanup-orphaned-supervisor
  • Scope: Apply two Gemini suggestions: (1) HIGH — use launchctl remove "$old_label" instead of launchctl unload "$old_plist" for robustness when plist is missing; (2) MEDIUM — use crontab -r || true instead of echo "" | crontab - to truly clear the crontab
  • Attempt: 1 of 1
  • Direction: Both suggestions are correct and should be applied. Remove 2>/dev/null blanket suppression per repo guidelines.

marcusquinn added a commit that referenced this pull request Mar 17, 2026
…(PR #5151)

- Replace `launchctl unload "$old_plist"` with `launchctl remove "$old_label" || true`
  and update condition to check agent registration first; more robust when
  plist file is missing. Remove 2>/dev/null per repo guidelines.
- Replace `echo "" | crontab -` with `crontab -r || true` to truly clear
  the crontab, consistent with the test script.
alex-solovyev added a commit that referenced this pull request Mar 17, 2026
After the supervisor-to-pulse-wrapper migration, rsync-based updates only
add/overwrite files — they don't delete files removed from the source.
Users who installed before the archival retain 14 orphaned scripts in
~/.aidevops/agents/scripts/ that no longer exist upstream.

Add them to the deprecated_paths array in cleanup_deprecated_paths() so
they are removed on the next aidevops update, following the same pattern
used for supervisor-helper.sh in PR #5151.

Scripts: pattern-tracker, quality-sweep, quality-loop, review-pulse,
self-improve, coderabbit-pulse, coderabbit-task-creator,
audit-task-creator, batch-cleanup, coordinator, finding-to-task,
objective-runner, ralph-loop, stale-pr.

Closes #5155
alex-solovyev added a commit that referenced this pull request Mar 17, 2026
…5157)

After the supervisor-to-pulse-wrapper migration, rsync-based updates only
add/overwrite files — they don't delete files removed from the source.
Users who installed before the archival retain 14 orphaned scripts in
~/.aidevops/agents/scripts/ that no longer exist upstream.

Add them to the deprecated_paths array in cleanup_deprecated_paths() so
they are removed on the next aidevops update, following the same pattern
used for supervisor-helper.sh in PR #5151.

Scripts: pattern-tracker, quality-sweep, quality-loop, review-pulse,
self-improve, coderabbit-pulse, coderabbit-task-creator,
audit-task-creator, batch-cleanup, coordinator, finding-to-task,
objective-runner, ralph-loop, stale-pr.

Closes #5155
alex-solovyev added a commit that referenced this pull request Mar 17, 2026
…visor (GH#5159)

- launchd: remove 2>/dev/null from _launchd_has_agent call and
  launchctl remove; reorder condition to check agent registration
  first (handles orphaned agents without plist files)
- crontab: remove 2>/dev/null from crontab - and crontab -r so
  permission errors surface for debugging

Per Gemini Code Assist review on PR #5151 (1 high, 1 medium finding).
The || true guards already prevent script abort on expected failures.

shellcheck: 0 violations | tests: 10/10 pass

Closes #5159
alex-solovyev added a commit that referenced this pull request Mar 17, 2026
…visor (GH#5159) (#5175)

- launchd: remove 2>/dev/null from _launchd_has_agent call and
  launchctl remove; reorder condition to check agent registration
  first (handles orphaned agents without plist files)
- crontab: remove 2>/dev/null from crontab - and crontab -r so
  permission errors surface for debugging

Per Gemini Code Assist review on PR #5151 (1 high, 1 medium finding).
The || true guards already prevent script abort on expected failures.

shellcheck: 0 violations | tests: 10/10 pass

Closes #5159
@marcusquinn marcusquinn added the review-feedback-scanned Merged PR already scanned for quality feedback label Mar 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-review-fixes review-feedback-scanned Merged PR already scanned for quality feedback

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug: aidevops update leaves orphaned supervisor-helper.sh + supervisor/ modules — users run archived code instead of pulse-wrapper.sh

2 participants