Skip to content
Back to skills

161 Fn 13 Pxj2 F2f73773

ASecurity

Add sentinel file checking to ralph.sh template so Ralph can be paused/stopped externally.

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 11, 2026
testingbash

Security analysis

A100/100

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 161-fn-13-pxj2_f2f73773 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 161 Fn 13 Pxj2 F2f73773?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 161 Fn 13 Pxj2 F2f73773
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-161-fn-13-pxj2-f2f73773/badge)](https://www.skillsdirectory.com/skills/tools-only-161-fn-13-pxj2-f2f73773)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
# fn-13-pxj.2 Add sentinel file checks to ralph.sh

## Description
Add sentinel file checking to ralph.sh template so Ralph can be paused/stopped externally.

**CRITICAL**: Also ensure ALL exit paths write completion marker to progress.txt. Currently, some paths (e.g., `status == "none"`) exit without writing completion marker, making finished runs look "active" forever.

### Completion Marker Format

**CANONICAL MARKER**: `promise=COMPLETE` (plain text, NOT XML tagged)

This must match what `find_active_runs()` searches for in task fn-13-pxj.1. The detection checks for substring `promise=COMPLETE`, so the marker must be exactly that.

### Implementation

**In `plugins/flow-next/skills/flow-next-ralph-init/templates/ralph.sh`:**

1. Add `write_completion_marker()` function:
   ```bash
   write_completion_marker() {
     local reason="${1:-DONE}"
     echo "" >> "$PROGRESS_FILE"
     echo "completion_reason=$reason" >> "$PROGRESS_FILE"
     echo "promise=COMPLETE" >> "$PROGRESS_FILE"  # MUST match find_active_runs() detection
   }
   ```

2. Add `check_sentinels()` function:
   ```bash
   check_sentinels() {
     local pause_file="$RUN_DIR/PAUSE"
     local stop_file="$RUN_DIR/STOP"

     # Check for stop (do NOT remove file - keep for audit)
     if [[ -f "$stop_file" ]]; then
       log "STOP sentinel detected, exiting gracefully"
       write_completion_marker "STOPPED"
       exit 0
     fi

     # Check for pause (log once, not every loop)
     if [[ -f "$pause_file" ]]; then
       log "PAUSED - waiting for resume..."
       while [[ -f "$pause_file" ]]; do
         sleep 5
       done
       log "Resumed"
     fi
   }
   ```

3. Update ALL exit paths to call `write_completion_marker()`:
   - `status == "none"` (no work): `write_completion_marker "NO_WORK"`
   - Max iterations reached: `write_completion_marker "MAX_ITERATIONS"` (before exit, even if non-zero)
   - Normal completion: `write_completion_marker "DONE"`
   - FAIL paths: `write_completion_marker "FAILED"` (before exit 1)

4. Call `check_sentinels()` in main loop:
   - At start of each iteration (before work selection)
   - After Claude returns (before sleep/next iteration)

### Sentinel Semantics
- File presence = state active
- PAUSE: log once on enter, loop with 5s sleep until removed, log "Resumed" on exit
- STOP: log message, write completion marker, exit 0 (do NOT remove STOP file)
- Checking happens at iteration boundary only (won't interrupt running Claude)

### Key Files
- `plugins/flow-next/skills/flow-next-ralph-init/templates/ralph.sh`
## Acceptance
- [ ] `write_completion_marker()` function added
- [ ] `check_sentinels()` function added to ralph.sh template
- [ ] PAUSE sentinel causes loop to sleep, logs once on enter + once on resume
- [ ] STOP sentinel writes completion marker then exits (file NOT removed)
- [ ] Function called at start of each iteration (before work selection)
- [ ] Function called after Claude returns (before sleep/next iteration)
- [ ] ALL exit paths call `write_completion_marker()` with appropriate reason
- [ ] `status == "none"` exit writes "NO_WORK" marker
- [ ] Max iterations exit writes "MAX_ITERATIONS" marker
## Done summary
- Added `write_completion_marker()` - writes `promise=COMPLETE` + reason to progress.txt
- Added `check_sentinels()` - PAUSE loops with 5s sleep, STOP exits gracefully
- Updated 4 exit paths: NO_WORK, DONE, FAILED, MAX_ITERATIONS
- Sentinel checks at iteration start + after Claude returns

Why: Enable external pause/stop control + proper active run detection

Verification: CI (31/31), smoke (28/28), bash syntax OK
## Evidence
- Commits: a7a9720c69c27c323f52eadce453ad38e275289a
- Tests: plugins/flow-next/scripts/ci_test.sh, plugins/flow-next/scripts/smoke_test.sh
- PRs:

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.