# Quick Task Plan: Fix check_alive parent_pid fallback

## Task
Fix `check_alive` to fall back to `parent_pid` liveness check when poll `pid` is dead. Prevents false STALE errors when delivering to agents between poll cycles.

## Problem
When an agent processes a message between poll cycles:
1. Poll writes `"pid":"BUSY"` and returns — owl.exe exits
2. Agent processes message (time passes)
3. Agent re-polls — new owl.exe starts with new PID

If the poll process crashes/is killed without writing BUSY, or if info.json has a stale numeric PID, `check_alive` reports STALE even though the parent Claude session (`parent_pid`) is still alive and will re-poll.

## Changes

### Task 1: Update `check_alive` in `src/owl/deliver.rs`
- After finding `pid` is dead, check `parent_pid` from info.json
- If `parent_pid` is alive, treat as alive (agent is between polls)
- Only report STALE if both `pid` and `parent_pid` are dead

### Task 2: Update GC logic in `src/owl/list.rs`
- Same fallback: if `pid` is dead but `parent_pid` is alive, show as ACTIVE
- Only GC if both are dead

### Task 3: Add `get_parent_pid_from_info` helper to `src/common/types.rs`
- Extract `parent_pid` from info.json (mirrors `get_pid_from_info`)

### Task 4: Build and test
- `cargo build` to verify compilation
- Verify with existing todlando scenario

## Files
- `src/owl/deliver.rs` — check_alive function
- `src/owl/list.rs` — GC logic
- `src/common/types.rs` — add parent_pid extraction helper
